如何使用原型继承初始化JavaScript中的成员变量

时间:2010-02-01 12:17:30

标签: javascript

我正试图了解原型继承并对共享成员变量提出疑问。

我有一个对象:

var objA = {
    list: [],
    myPush: function(aParam){
      this.list.push(aParam);
    }
}

并尝试使用http://javascript.crockford.com/prototypal.html

中的object()函数“原型继承”它
var objB = object(objA);

但不知何故,对objA的更改转移到了objB:

objA.myPush('a string');
equals(objA.list.length, 1);
equals(objB.list.length, 0); //<= Fails. Why?

测试失败的完整代码:http://jsbin.com/izawi/edit

有人可以向我解释一下吗?并可能的修复。我可以有一个constuct()函数,但这似乎不对。

提前致谢

的Matthias

1 个答案:

答案 0 :(得分:1)

在早期的帖子中暴露出来,Crockford的对象功能略有破坏。让我看看我是否能找到有问题的SO线程。

“传统”构造函数继承有效:

var a = {
    list: [],
    myPush: function(aParam){
      this.list.push(aParam);
    }
}

function B () {}
B.prototype = a;

var b = new B();
a.myPush('a string');

b.list.length == a.list.length; // true

这比“正确的”原型继承略纯 - 构造函数继承自对象而不是从对象继承的对象。是的,它在某种程度上对我来说也不合适。不,我无法解释为什么Crockford的对象功能在此失败。这就是我猜的世界运作方式。

更新:以下是我一直在考虑的相关讨论:Implementing instance methods/variables in prototypal inheritance