2012-01-19 53 views
2

這很複雜,但我已經有好幾天了。我將一個Javascript「類」「擴展」到另一個,但是從子類方法調用基類方法無法正常工作。看起來好像基類方法「作用」爲靜態方法:在從子類方法調用基類方法時,在類中定義的屬性在某種程度上具有它們的默認值。Javascript類擴展:從子級函數調用基類函數:似乎是調用靜態方法

爲了讓事情簡單我不包括我的精心製作的代碼,但創造的我在做什麼一個簡單的例子:

function extend(Child, Parent){ 
    var F = function(){}; 
    F.prototype = Parent.prototype; 
    Child.prototype = new F(); 
    Child.prototype.constructor = Child; 
    Child.base = Parent.prototype; 
} 

function BaseClass(){ 
} 

BaseClass.prototype.randomNumber = 0; 
BaseClass.prototype.functionA = function(){ 
    this.randomNumber = 200; 
    this.functionB(); 
} 

BaseClass.prototype.functionB = function(){ 
    alert(this.randomNumber); 
    console.info(this); 
} 

function ChildClass(){ 

    this.functionB = function(){ 
     ChildClass.base.functionB(); 
    }; 
} 

extend(ChildClass, BaseClass); 
var childInstance = new ChildClass(); 
childInstance.functionA(); 

我用螢火蟲來登錄到控制檯。它輸出的「Baseclass」和this.randomNumber在某種程度上是0,而在functionA中它被設置爲200。

我使用的擴展方法與來自Yahoo.lang.extend的擴展方法類似,我也嘗試過使用相同的結果。

我不明白,如果我失去了一些東西,或者這只是「擴展」Javascript的缺點之一,我實際上在這裏調用「靜態」方法。在這裏非常感謝幫助。希望很清楚我在這裏要做什麼,因爲我覺得把它放在文字上很複雜。提前感謝!

回答

5

在這行代碼會發生什麼:

ChildClass.base.functionB(); 

...是functionB被稱爲與this指向ChildClass.base。這是因爲在JavaScript中,this完全由定義,函數如何被稱爲,而不是其定義的位置(與其他許多具有該關鍵字的語言不同)。打這通電話,同時保留的this的意思,你會使用call

ChildClass.base.functionB.call(this); 

...在通話過程中,其中明確規定this是你通過任何的(this,在這種情況下)。更多:Mythical methods | You must remember this


順便說一句,如果你有興趣在繼承層次和撥打電話到父對象(我不會說「下課」的JavaScript沒有類),我寫這個了幾年前:Simple, Efficient Supercalls in JavaScript它使用類似於類的術語,它實際上不應該這樣做(它只是幫助方法使原型繼承的層次結構更容易連接),並且它早於ECMAScript 5(JavaScript的最新版本)一些適用的功能。所以我需要更新它,但它可能對您有用。

+0

非常好!這在我讀到關於Javascript繼承的書中沒有解釋。所以實際上我是在調用一個「靜態」方法。我檢查了你的鏈接(「神祕方法」)。使用ChildClass.base.functionB.call(this);訣竅。非常感謝! :) –

+0

謝謝,我會看看它。類確實不是一個好的關鍵字,這就是爲什麼我用引號。在使用.call(this)時,我仍然遇到「this」的問題。我正在研究Javascript圖像旋轉木馬,但「這個」全都搞砸了。我在這裏放棄,這是可怕的語言。 –

+0

@JustinvanSchaick:這並不糟糕,它與你以前的習慣不同。一旦你瞭解它,它是非常強大和靈活的。我並不是說這是一種完美的語言(沒有一種),我並不是說我沒有改進的東西,但是一旦你理解它,它就會非常非常好。 –