Property Read/Write Asymmetry
When you put a property in a constructor's prototype object, the property can be read just as if it were part of each object instance created with that constructor. That is, you can access the area method in the example above using the expression obj1.area() no matter where area was defined (constructor prototype or object instance). However, when you write to a property the prototype properties are not accessible. Instead, writing to a property that has the same name as a prototype property creates a local property in that object instance instead of modifying the constructor's prototype property.
Assume you start with the following object constructor:
Circle(radius):={
.radius=radius;
Circle.prototype.area=Circle_area;
}
Circle_area(none):=PI*.radius^2
The following statements illustrate how various versions of the area method are accessed:
Area Method
| Method | Description |
|---|---|
var obj=new Circle(5); |
// create a new object |
obj.area(); |
// call Circle_area |
obj.area=My_area; |
// create new method in obj |
obj.area(); |
// call My_area |
delete obj.area; |
// delete local area method |
obj.area(); |
// call Circle_area |
Circle.prototype.area=My_area; |
// replace prototype method |
obj.area(); |
// call My_area |
In the example above, you can read the value of the constructor's prototype method named area using the expression
However, to write to this method, you must use the expression
In contrast, the local method named area stored in the object instance can be accessed for both reading and writing using the expression