2014-07-26 73 views
1

有一個在CoffeScript下面的類:類中的CoffeeScript

class MyClass 

    f: (@x) -> 

翻譯這段代碼在JS有:

(function() { 
    var MyClass; 

    MyClass = (function() { 
    function MyClass() {} 

    MyClass.prototype.f = function(x) { 
     this.x = x; 
    }; 

    return MyClass; 
    })(); 
}).call(this); 

我不明白爲什麼,以增加功能MyClass的我應該使用它的原型;爲什麼我不能使用'MyClass.f = function(x)...「?請向我解釋。謝謝。

+1

究竟是什麼問題?你想說'MyClass.f(x)'還是'o = new MyClass; o.f(X)'? –

回答

2

如果定義

class MyClass 
    f: (@x) -> 
    @g: (@x) -> 
m = new MyClass() 

你會發現,MyClass具有g屬性,但不具有f,而m具有f,但不具有g

要訪問gm,您必須使用m.constructor.g

MyClass.prototype == m.__proto__

要真正理解這一點,您需要深入研究Javascript的原型繼承結構。

https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Operators/new

當執行代碼的新富(...),下面的事情發生:創建

  • 一個新的對象,從foo.prototype繼承。

  • 構造函數調用函數foo使用指定的參數...

  • 由構造函數返回的對象將成爲全新的表達式的結果。 ...

因此,關鍵的一點是,新的對象繼承(實際上是複印件)從類prototype

0

您不必使用原型鏈,就可以將靜態方法指定爲還有這樣的:

class MyClass 

    @f: (@x) -> 

這將輸出:

var MyClass; 

MyClass = (function() { 
    function MyClass() {} 

    MyClass.f = function(x) { 
    this.x = x; 
    }; 

    return MyClass; 

})(); 
+0

'C.m()'和'new C()。m()'之間的區別可能是混淆的重要組成部分。 –