簡體   English   中英

繼承:構造函數不運行“超級”?

[英]Inheritance: Constructor doesn't run “super”?

使用JS幾個月后我遇到了這種行為。 由於我的Java背景,我很困惑:我創建了一個類並創建了子類。 調用子類的構造函數不會調用父構造函數。 好的,我讀到了這個行為,看起來很正常,對吧?

請參閱此jsfiddle 示例以幫助我澄清。

因此,要讓我的子類構造函數運行其每個父構造函數,我將添加以下內容(請參閱jsfiddle 示例

好吧,這種方式看起來效果更好。 現在,我想知道以下幾點; 有沒有辦法指定哪個是超類而不觸發它的構造函數? 例如,以下運行Node()方法:

GameObject.prototype = new Node();
GameObject.prototype.constructor=GameObject;

(參見更新的jsfiddle 示例

我情不自禁地覺得我做得不對。 由於我的真實模型分為7個子類,因此對我的構造函數總共有21個調用(6 + 5 + 4 + 3 + 2 + 1 = 21)。

難道我做錯了什么? 謝謝你的時間!

你本來沒有做錯任何事。 這是給出代碼的預期行為。 但是,您可以使用類似於John Resig的“Simple JavaScript Inheritence”中描述的方法。 可以在stackoverflow上找到類似方法的另一個討論。

您不需要僅調用父的構造函數來設置繼承鏈。 請參閱http://js-bits.blogspot.com/2010/08/javascript-inheritance-done-right.html

以下是不好的,運行父的構造函數只是為了設置原型鏈

GameObject.prototype = new Node();
GameObject.prototype.constructor = GameObject;

更好的方法是使用代理構造函數來附加原型而不實例化“超類”。

// Surrogate constructor
var TempCtor = function(){};
TempCtor.prototype = Node.prototype;
// Setup the prototype chain without side effects
GameObject.prototype = new tempCtor();
GameObject.prototype.constructor=GameObject;

並且您需要確保從子類調用父構造函數

function GameObject() {
    // Call the parent's constructor
    Node.call(this);
}

我已經用一個示例更新了你的jsfiddle,它顯示了設置繼承的正確方法http://jsfiddle.net/2caTD/5/

我的理解是JavaScript並不像C ++,Java和C#這樣的傳統語言那樣天真地實現類。 我認為你可以通過使用一個JavaScript框架來獲得你想要的行為,這個框架強加了你習慣的行為,比如Java。

Moo Tools就是這樣一個框架: http//mootools.net

一般來說,你做得對。 但是構造函數會在其實例上創建屬性,並將這些屬性分配給繼承構造函數的原型。

Subclass.prototype.animations ,例如是在原型,通過所有進一步的實例共享Subclass 從您的代碼中,您似乎希望為每個實例重新創建這些animations

如何解決這個問題? 根本不要使用構造函數。 使用對象文字和Object.create

var Node = {
    init: function () { this.animations = []; },
    doSomething: function () { console.log(this.animations); }
};

var GameObject = Object.create(Node);
GameObject.doSomethingElse = function () { this.init(); this.doSomething(); }

以與繼承相同的方式實例化:

var gameObj = Object.create(GameObject);
gameObj.doSomethingElse();

它不應該比那更困難。

請參閱將繼承與模塊模式組合在一起

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM