2017-05-24 10 views
1

私は、コンストラクタのプロトタイプで関数を持っている:JavaScriptのベストプラクティスのプロトタイプ

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

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

createToysは、まだ宣言する必要があります。そして、それは私の質問が指しているところです。

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

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

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

それとも、以下のような方法(プロトタイプ)として、それを作成します。:generateToysが、そうのような方法generateToyscreateToysを作成する方が良いだろう、createToys()を呼び出します唯一の方法になると仮定すると

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

何が良いのでしょうか、なぜですか? :)

+1

に依存します。あなたのオブジェクトのインスタンスがcreateToysに直接アクセスできるようにしますか?またはgenerateToysを通過させたいのですか?あなたは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() { 

    } 

}) 

呼び出すたびに宣言することになりつまり、あなたのインスタンスの各それを直接呼び出すことができます。プロトタイプ自体は、すべてのインスタンスで共有される単一の参照であるため、その宣言を持つメモリ内に1つの場所しかありません。

関連する問題