编辑:修复我的示例以演示该行为。
我希望 AbstractParent 的 details
属性成为我所说的“实例属性”,但它更像是一个“静态属性”。我意识到这些术语不适合 javascript,那么为什么当我创建一个新的子类时它没有获得自己唯一的 AbstractParent 原型(prototype)?为什么他们共用一个?
在下面的代码中,我希望得到一个空警报,但我得到的却是“新的详细信息”
var AbstractParent = Backbone.Model.extend({
details: [],
addDetail: function(detail) {
this.details.push(detail);
},
getDetails: function() {
var rtn = '';
for(var i=0;i<this.details.length;i++) {
rtn += this.details[i];
}
return rtn;
}
});
var Child = AbstractParent.extend({});
var ch1 = new Child;
ch1.addDetail("new details");
var ch2 = new Child;
alert(ch2.getDetails()); // => 'new details'
这似乎只在 details
是数组时才有效。如果它是字符串或对象,则它不会被 ch1
和 ch2
共享。
最佳答案
好的,我想通了这个问题。我原来问题的代码不准确,所以我向其他响应者道歉(他们在我提供的代码的上下文中是正确的)。
这里描述了解决方案: Javascript object members that are prototyped as arrays become shared by all class instances
基本上,两个 Child 实例共享同一个 AbstractParent 函数作为其原型(prototype)这一事实意味着对 AbstractParent 中的任何更改都将反射(reflect)在两个子实例的原型(prototype)中。
这仅在使用数组时才出现的原因是因为我在原型(prototype)中初始化了数组,然后只是更改它而不是在 addDetail
函数中覆盖它。当我使用对象或字符串作为属性名称然后进行赋值时,函数调用时上下文中的 this
属于 Child 实例,因此 this.name = 'Billy';
在 AbstractParent 函数中实际上是将其附加到 Child 实例,而不是在 AbstractParent 中。我在想每个 Child 实例都会得到自己的 AbstractParent 原型(prototype)实例,当我访问 this.name 时,它不会在 Child 上找到它,而是会转到 this.prototype.name
。
在我问题的代码中,我可以通过向实例化详细信息数组的 AbstractParent 添加一个 initialize
函数来解决此问题。但是,如果我向 Child 添加一个 initialize
函数并且我没有调用其中的父构造函数,那么我会遇到与以前相同的问题。
关于javascript - 为什么我的 javascript Backbone.js 模型共享其父类的相同 "instance"?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6143745/