2013-03-23 21 views
0

我有一個javascript對象有多種方法。但是我注意到有關方法定義方式的一些不一致。Javascript方法定義不一致

這裏是對象:

function MenuObject(containerId, skin) { 

    this.id = containerId; 
    this.something = something2; 
    . 
    . 
    . 
    this.anotherThing = anotherThing2;  

    this.setSkin = function(skin) { //We have a function here 

     //body... 
    { 


} 


MenuObject.prototype.getTopLevelPolygon = function() //Another function. 
{ 
    var p = this.something3; 

    //Method body goes here... 
} 

一些的功能等this.functionName =函數(),其他類似MenuObject.prototype.functionName =函數()

定義我只是想知道爲什麼不屬於MenuObject定義爲MenuObject.prototype.functionName = function()的所有函數?

+1

所以* real *問題是「爲什麼方法被添加到.prototype?」或者,也許,「原型'屬性是什麼?」或..提示:搜索「JavaScript原型」。 – 2013-03-23 00:36:56

回答

2

如果您沒有使用私有實例變量,那麼定義使用原型的方法通常會更高效,因爲它們通過javascript內部(通過原型)一次性分配給新對象,而不是單獨分配一個在你自己的代碼中。

而且,良好的編碼習慣會說你不應該使用混合的方法,除非有特定的理由這樣做(並且這段代碼並不表示使用混合的任何特定原因)。

有在構造函數分配方法的原因,當你希望他們有機會獲得一個私有的實例變量:

function MenuObject(containerId, skin) { 

    var myPrivateVariable = 0; 

    this.setSkin = function(skin) { 
     // method can access myPrivateVariable here, 
     // but a method put on the prototype cannot access it 
    } 
} 

你可以閱讀更多關於私有的實例變量在這裏:http://javascript.crockford.com/private.html

+0

@JoroSeksa - 看我最近的編輯。它有一個私人實例變量。在這裏看到更完整的書面:http://javascript.crockford.com/private.html – jfriend00 2013-03-23 00:30:16

1

簡而言之,構造函數中指定爲this.functionName = function()的項目是按需創建的,而使用prototype創建的項目更像靜態函數,因爲它們存在於「函數」實例之外,並且已構建程序執行時,與實例化時相反。不一致既可能是故意的,也可能是初級程序設計的產物(可能更早)。

編輯:

順便說一句,還有更給它比,但在細節上繼續下去,有一兩件事只是浮現在腦海,它也可以讓你有裏面的「私人」功能「班級」如果你讓我這麼稱呼它的話。您也可以用這種方式定義原型對象:

SomeFunction.prototype = { 
    SomeFn1:function(){}, 
    SomeFn2:function(){}, 
    SomeFn3:function(){} // etc etc 
}; 
1

區別在於何時需要將公共函數添加到對象。

this.functionName = function()方法要求您在聲明對象function MenuObject(containerId, skin) { ... };時定義所有對象函數。

MenuObject.prototype.functionName = function()方法允許你已經聲明的對象早些時候之後添加額外的功能的對象。有點像添加插件擴充不同情況下的對象。

1

定義方法在構造函數中(this.method = fun ..)可以通過使用閉包來使用「私有」數據。另外,每次調用構造函數時,都會創建構造函數內的方法。如果在調用構造函數時不使用'new','this'通常會附加到全局窗口對象上,因此會導致非常混亂和誤解的錯誤。

在構造函數之外定義方法(MenuObj.prototype.method = fun ..)可以隨時在代碼中被覆蓋,而在構造函數中定義總是優先的,並且不能被原型修改覆蓋。編輯原型會影響原型鏈,並可能導致非常混亂和誤解的錯誤。

我建議讀道格拉斯克羅克福德的書或去他的網站http://www.crockford.com/,看看JavaScript上的視頻和散文。