我创建了一个如下所示的对象。
var BaseObject = function(){
var base = this;
base.prop;
base.setProp = function(val){
base.prop = val;
}
}
当我调用 setProp
方法时,我得到以下信息。
var a = new BaseObject();
var b = new BaseObject();
a.setProp("foo");
b.setProp("bar");
console.log(a.prop); // outputs 'foo'
console.log(b.prop); // outputs 'bar'
然后我像这样创建了另一个继承自 BaseObject
的对象。
var TestObject = function(){
// do something
}
TestObject.prototype = new BaseObject();
当我这样做时,我得到了我意想不到的结果。
var a = new TestObject();
var b = new TestObject();
a.setProp("foo");
b.setProp("bar");
console.log(a.prop); // outputs 'bar'
console.log(b.prop); // outputs 'bar'
我不知道为什么。我最近读了很多关于闭包和原型(prototype)继承的文章,我怀疑我把它们都弄糊涂了。因此,将不胜感激任何关于为什么这个特定示例以其方式工作的指示。
最佳答案
只有一个 BaseObject
实例,所有 TestObject
都继承自该实例。不要使用实例来创建原型(prototype)链!
你想要的是:
var TestObject = function(){
BaseObject.call(this); // give this instance own properties from BaseObject
// do something
}
TestObject.prototype = Object.create(BaseObject.prototype);
参见 JavaScript inheritance: Object.create vs new , Correct javascript inheritance和 What is the reason to use the 'new' keyword at Derived.prototype = new Base有关 new
问题的详细说明。也看看 Crockford's Prototypal inheritance - Issues with nested objects
关于javascript - 为什么我的 JavaScript 对象属性会被其他实例覆盖?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13127589/