2012-11-13 55 views
3

我在學習Javascript,並且有幾個關於Javascript和OOP的問題。我注意到各種教程中的「類」中的不同函數聲明。首先是內部構造:Javascript:何時在構造函數中定義函數以及何時使用原型?

Class = function() { 
    this.doSomething = function() {....}; 
} 

而另一種是:

Class = function() {} 
Class.prototype.doSomething = function() {....}; 

在哪些情況下應先施工中使用,並在其中的情況應該第二建築工程中使用?

而另一個問題是:我是否正確理解在js中沒有protected屬性或方法?什麼是用來代替?

預先感謝您!

+2

關於你的第二個問題(這確實應該是一個單獨的問題):有下劃線前綴他們。人們會知道這些是通常不應該訪問的內部方法。 – ThiefMaster

回答

9

當您在構造函數中定義一個函數爲this.myFunction=...時,它是特定於您的實例的。這意味着它必須構建並保存在所有可能很重的情況下。它也不能被繼承。

唯一有效的理由這樣做是:

  • 特定值的封閉
  • 其他類型的特定功能(可能每次都構建不同的功能)

大多數情況,你真正需要的是一個在原型上定義的函數。

MDN on objects

在JavaScript中的所有對象都從Object下降;所有對象 都繼承Object.prototype的方法和屬性,但它們可能會被覆蓋。例如,其他構造函數的原型 會覆蓋構造函數屬性並提供它們自己的toString 方法。對象原型對象的更改會傳播到所有對象,除非這些更改的屬性和方法沿着原型鏈進一步重寫 。

關於你提到的另一個問題:下面的代碼建立一個非直接訪問功能:

Class = function() { 
    var imprivate = function(){...}; 
    this.doSomething = function() { uses imprivate}; 
} 

一個缺點是,你擁有的Class每個實例不同的功能實例。這通常是爲modules(從中只有一個實例)完成的。就個人而言,我更喜歡通過ThiefMaster在評論建議做的正是:我聲明我私人活動_

// private method 
XBasedGrapher.prototype._ensureInit = function() { 
+0

謝謝你的grat答案! – Eugeny89

+0

所以私有方法(我的意思是'var imprivate = function(){...};')只適用於沒有多個實例的類中? – Eugeny89

+0

你可以這麼說。就我個人而言,我認爲沒有必要爲其他編碼者辯護,所以我只是使用'_'符號(帶有'// private method'註釋),這對我的同事來說已經足夠清楚了。 –

相關問題