2011-09-16 35 views
0

例子:如何列出的CoffeeScript或JavaScript繼承類的方法

class Complex 
    constructor: (@a, @b) -> 
    conjugate: -> new Complex(@a, [email protected]) 

    class ComplexSon extends Complex 
    constructor: (@a, @b) -> 
     @c = 3.14 
    magnitude: -> @a*@a + @b*@b 

我已經定義了以下方法:

dumpMethods = (klass) -> 
    Object.getOwnPropertyNames(klass.property).sort() 

測試用例:

dumpMethods(Complex) == ['conjugate', 'constructor'] 
    # success 

    dumpMethods(ComplexSon) == ['conjugate', 'constructor', 'magnitude'] 
    # fails, returns      ['constructor', 'magnitude'] 

什麼dumpMethods的正確定義?

+0

JavaScript沒有類。 Coffeescript在這方面本質上是有缺陷的。閱讀原型對象設計。 – Incognito

回答

2

禁止,

Javascript(因此咖啡腳本)使用原型對象。

我建議你閱讀它,因爲事情相當複雜。

試圖總結一下,每個對象都有一個原型。原型本身就是一個對象,具有自己的屬性,並且還有一個原型,等等。

原型鏈實際上定義了類層次結構。因此,在你的情況下,ComplexSon將有一個複雜的原型,它將有一個原型,即Object本身,它是javascript中所有對象層次結構的根。

當您在實例上調用某個方法時,javascript將在該實例上搜索該方法,然後在其原型中搜索,然後在鏈上搜索。找到的第一個是它將執行的方法。

與大多數編程語言一樣,您可以「升」層次結構並查看超類,但很少會因爲語言解釋器本身很少需要關閉而停止使用。但是有一些解決方法,比如原型使用的方法來知道給定類的子類,但是AFAIK它們本身並不在語言中,通常它們只是跟蹤定義的類。

關於方法,在您的代碼中,您正在查看ComplexSon的屬性,該屬性正確地只包含兩種方法。另一個(coniugate)不在那裏,因爲它是通過原型來實現的,你可以通過遞歸的原型鏈來列出它們。

2

基於詹尼的回答,我結束了以下實施。 dumpMethods遍歷根類Object,但避免列出Object中的方法。

dumpMethods = (klass) -> 
    res = [] 
    k = klass.prototype 
    while k 
     names = Object.getOwnPropertyNames(k) 
     res = res.concat(names) 
     k = Object.getPrototypeOf(k) 
     break if not Object.getPrototypeOf(k) # suppress Object 
    res.unique().sort()