5

我创建了一个如下所示的对象。

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'

我不知道为什么。最近我读了很多关于闭包和原型继承的文章,我怀疑我已经把它搞糊涂了。因此,任何有关此特定示例为何按其方式工作的指示都将不胜感激。

4

2 回答 2

3

只有一个BaseObject实例可以从所有TestObjects 继承。不要使用实例来创建原型链!

你想要的是:

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

有关. _ _ _ _ _ _ new还可以看看Crockford 的原型继承 - 嵌套对象的问题

于 2012-10-29T18:47:11.613 回答
2

将原型继承视为仅处理对象而没有类的概念。在您的代码中,您有一个BaseObject具有prop属性的对象。您有 2 个其他对象从该对象的 1 个实例扩展,但该属性属于原始对象。如果您需要每个对象都有自己的副本,则需要为它们提供一个为该对象初始化的不同变量(例如在它们的构造函数中)。

顺便说一句,Java 风格的访问器在 JavaScript 中是多余的(如果需要,您可以在本机拦截访问)并且可能会进一步混淆这些问题,因为它们的行为会有所不同。

于 2012-10-29T18:36:31.627 回答