2017-05-24 71 views
1

我在構造函數的原型功能:JavaScript的最佳實踐原型

function Animal(name) { 
    this.name = name 
} 

Animal.prototype.generateToys = function(numberOfToys) { 
    if(numberOfToys == 1) { 
    this.createToys(); 
    } 
    else { 
    this.createToys(); 
    } 
} 

createToys仍然需要申報。這就是我的問題指向的地方。假設generateToys將是將調用createToys()的唯一方法,那會是最好創建createToys方法generateToys內像這樣:

function Animal(name) { 
    this.name = name 
} 

Animal.prototype.generateToys = function(numberOfToys) { 
    if(numberOfToys == 1) { 
    this.createToys(); 
    } 
    else { 
    this.createToys(); 
    } 

    function createToys() { 
    ... 
    ... 
    ... 
    } 
} 

或者你可以創建它作爲一個方法(原型)類似如下:

Animal.prototype.createToys = function() { 
    ... 
    ... 
    ... 
} 

什麼會更好,爲什麼? :)

+1

取決於。你想讓你的對象的任何實例都可以直接訪問createToys嗎?或者你想讓他們通過generateToys?既然你有一個if裏面generateToys,我猜你希望他們總是通過generateToys,所以這個函數應該是私人的 – yBrodsky

+3

最好的解決方案是工作。你的第一個建議不會讓'createToys'成爲實例的一個屬性,所以調用'this.createToys()'將失敗(即它不起作用)。但即使你修正了這個問題,爲什麼每次調用generateToys時都必須重新創建'createToys'?這似乎沒有必要(至少在你的例子中)。定義一次函數。你做什麼('prototype',「class」之外的功能)並不重要。 –

+1

我建議你看一看Douglas Crockford,Function The Ultimate(https://www.youtube.com/watch?v=ya4UHuXNygM)的演講,它展示了創建對象的各種方法? – Booster2ooo

回答

1

如果將它放在generateToys()方法中,它將在您每次調用該方法時重新聲明,然後在方法完成時從範圍中刪除。大多數情況下,這不是你想要的,所以你更願意將它創建爲一個單獨的方法。

1

這取決於你的架構。

如果您打算有很多Animal的實例,那麼將您的方法添加到原型會更好,否則您將創建大量的私有函數,並且代價很高(就性能而言)。

1

聲明原型裏面的功能限制了範圍外的知名度和導致要每次聲明的函數調用Animal.prototype.generateToys()(浪費內存)

Animal.prototype.generateToys = function(numberOfToys) { 
    var createToys = function createToys() { 

    } 

}) 

宣佈它的原型是指每個實例可以直接調用它,你將只有一個內存中的位置,因爲原型本身是所有實例共享的單個引用。