属性读写不对称

当您将属性放入构造函数的原型对象时,该属性可以像使用该构造函数创建的每个对象实例的一部分一样被读取。也就是说,无论 area 是在何处定义的(构造函数原型或对象实例),您都可以使用表达式 obj1.area() 访问上述示例中的 area 方法。但是,当您写入属性时,原型属性不可访问。相反,写入与原型属性同名的属性会在该对象实例中创建一个本地属性,而不是修改构造函数的原型属性。

假设您从以下对象构造函数开始:

Circle(radius):={
    .radius=radius;
    Circle.prototype.area=Circle_area;
}
Circle_area(none):=PI*.radius^2

以下语句说明了如何访问 area 方法的各种版本:

Area 方法

方法 描述
var obj=new Circle(5); // 创建新对象
obj.area(); // 调用 Circle_area
obj.area=My_area; // 在 obj 中创建新方法
obj.area(); // 调用 My_area
delete obj.area; // 删除本地 area 方法
obj.area(); // 调用 Circle_area
Circle.prototype.area=My_area; // 替换原型方法
obj.area(); // 调用 My_area

在上述示例中,您可以使用以下表达式读取构造函数原型中名为 area 的方法的值

obj.area

但是,要写入此方法,您必须使用以下表达式

Circle.prototype.area

相比之下,存储在对象实例中的名为 area 的本地方法可以使用以下表达式进行读取和写入

obj.area

参见原型继承