【发布时间】:2011-10-11 08:18:58
【问题描述】:
基本上,我想要做的是已经讨论过很多次的事情。但是,大多数示例仅具有从 ClassB 继承的 ClassA。我的情况很琐碎,但似乎没有在我找到的 JavaScript 主题中得到解决。
ClassB 扩展了 ClassA,它有一个成员。 ClassC 和 ClassD 扩展 ClassB。但是,当在 ClassC 的实例中设置唯一成员时,该成员也在 ClassD 的成员中设置。我们来看一个例子:
function ClassA(data) {
var This = this;
This._data = {};
This._construct = function(data) {
if( undefined === data ) {
This._data = {};
return true;
}
This._data = data;
}
This._construct(data);
}
function ClassB() {
}
ClassB.prototype = new ClassA();
ClassB.prototype.constructor = ClassB;
function ClassC() { // Extends ClassB
}
ClassC.prototype = new ClassB();
ClassC.prototype.constructor = ClassC;
function ClassD() { // Extends ClassB
}
ClassD.prototype = new ClassB();
ClassD.prototype.constructor = ClassD;
var objectC = new ClassC();
var objectD = new ClassD();
objectC._data['somevar'] = 'asdasdasd';
console.log(objectC._data); // Object { somevar="asdasdasd"}
console.log(objectD._data); // Object { somevar="asdasdasd"}
如果您在console.log(objectC._data); 行设置断点,您可能会在FireBug 的Watch 窗口中看到所有原型都设置正确。这真的很奇怪,因为很明显 ClassC 和 ClassD 的原型是使用 new 关键字创建的独立实例,因此不应该共享成员。谁能解释一下?
_construct() 函数可以从 ClassA 中删除,但没有任何效果。
var This = this 行可以去掉,所有后续对This 的引用都可以改为this,没有效果。
【问题讨论】:
-
问题已解决。对于那些真正想知道自己在做什么的极客,请参阅this amazing article。我使用 jQuery,所以 this plugin 看起来是正确的解决方案。
-
好吧,this plugin 很垃圾,漏洞百出,貌似被作者抛弃了。相反,请查看this one
标签: javascript oop inheritance