基本上,我正在嘗試做的是已經討論過很多次。但是,大多數示例僅具有從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);
一個斷點,您可以在螢火蟲的觀察窗口,所有原型正確設置見。這很奇怪,因爲ClassC和ClassD的原型顯然是用new
關鍵字創建的獨立實例,因此不應共享成員。有人可以解釋嗎?
_construct()
函數可以從ClassA中移除,不起作用。 var This = this
行可以被刪除,所有後續對This
的引用可以更改爲this
,但不起作用。
問題解決。 對於那些真正想知道自己在做什麼的極客們來說,看看[這篇神奇的文章](http://blog.niftysnippets.org/2009/09/simple-efficient-supercalls-in.html)。 我使用jQuery,所以[this plugin](http://plugins.jquery.com/project/jClass)看起來是正確的解決方案。 – XedinUnknown
好吧,[這個插件](http://plugins.jquery.com/project/jClass)是垃圾,充滿了錯誤,看起來像是被作者拋棄了。相反,檢查[這一個](https://github.com/kilhage/class.js) – XedinUnknown