为什么实例方法定义在原型中,而实例字段定义在构造函数中?
Why are instance methods defined in the prototype but instance fields are defined in the constructor?
在JavaScript中进行继承时,我经常看到的模式是在原型中定义实例方法,但在构造函数中定义实例字段(参见下面的示例)。这样做的动机是什么?为什么不保持一致,并在原型中定义两者呢?
function MyClass() {
this.myField = 0; // why this...
}
MyClass.prototype.myField = 0; // ...instead of this?
说明
因为原型属性在所有实例之间是共享的,因为每个实例都有对同一个原型对象的引用。
这不是不可变类型的问题,你可以这样做:
MyClass.prototype.myField = 0;
var a = new MyClass();
a.myField = 42;
,只有a
有这个值。这是因为赋值为a
创建了属性myField
。您可以在赋值前后调用a.hasOwnProperty('myField')
来测试这一点。
但是如果你有对象或数组
MyClass.prototype.myField = [];
,你只是附加到该数组,不分配一个新的数组(如a.myField = []
),那么每个实例在该数组中具有新值。
解决方案
必须在构造函数中初始化数组和对象,以便每个实例获得自己的对象或数组实例。一些风格指南建议你仍然在原型上创建属性,但是用null
初始化它。这除了在代码中添加一些概念性结构(如果存在的话)之外,没有任何好处。
function MyClass() {
this.myField = [];
}
/**
* @type {Array}
*/
MyClass.prototype.myField = null;
相关文章:
- 在wordpress一定时间后更改自定义字段
- Meteor-添加用户自定义字段的方法不起作用
- 微笑时间轴小部件添加自定义字段
- 使用具有用户定义字段的新请求者创建新的Zendesk票证
- WooCommerce-根据自定义字段添加费用
- 有了字段的名称,我如何用空白数据初始化对象的未定义字段
- 高级自定义字段按单选按钮值排序
- 从自定义DocuSign按钮添加信封自定义字段
- 如何使用inlineformset_factory添加自定义字段属性
- jQuery将地理补全输出到自定义字段
- 如何在自定义帖子类型中添加自定义字段
- 根据课程自定义字段在课程页面上添加链接
- 在Extjs中,获取自定义字段容器中的textfield值
- 同步读取package.json中的自定义字段
- 如何将自定义字段添加到Json结果-ASP.NET MVC
- 由 Bootstrap 3 中的高级自定义字段生成的 Google 地图
- 如何将自定义字段添加到 dhtmlxScheduler
- 我可以使用参数来定义字段名称吗?
- 如何使用Visual Force和Javascript在Salesforce中的自定义对象中获取自定义字段值
- 角度过滤器分组依据过滤器返回一个“未定义”字段