为什么我的JavaScript对象属性被其他实例覆盖?

gar*_*uan 5 javascript oop inheritance

我创建了一个像下面这样的对象.

var BaseObject = function(){

var base = this;
base.prop;

base.setProp = function(val){
    base.prop = val;
}
}
Run Code Online (Sandbox Code Playgroud)

当我调用该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'
Run Code Online (Sandbox Code Playgroud)

然后我创建了另一个继承自BaseObject这样的对象.

var TestObject = function(){
    // do something
}

TestObject.prototype = new BaseObject();
Run Code Online (Sandbox Code Playgroud)

当我这样做时,我得到了一个我没想到的结果.

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'
Run Code Online (Sandbox Code Playgroud)

我不知道为什么.我最近一直在阅读很多关于闭包和原型继承的内容,我怀疑我已经把它弄得一团糟.因此,非常感谢任何有关此特定示例为何如此工作的指针.

Ber*_*rgi 3

BaseObject所有 s 都继承自一个实例TestObject。不要使用实例来创建原型链!

你想要的是:

var TestObject = function(){
    BaseObject.call(this); // give this instance own properties from BaseObject
    // do something
}
TestObject.prototype = Object.create(BaseObject.prototype);
Run Code Online (Sandbox Code Playgroud)

请参阅JavaScript 继承:Object.create 与 new正确的 javascript 继承在 Derived.prototype = new Base 处使用 'new' 关键字的原因是什么,以获取有关 的问题的详细说明new。另请参阅Crockford 的原型继承 - 嵌套对象的问题