2016-11-03 4 views
1

メソッドの委譲(delegate prototype)はどのようにしてメモリリソースを保持できますか?JavaScriptでのプロトタイプの作成

メソッドの委譲はメモリを保持するので、これはメソッド代行/プロトタイプの継承が古典的継承よりも優先される理由の1つですか?

+1

は、内部機能の再利用を可能にし、プロトタイプのRAMの節約が大きく誇張されています。まだ悪いパターンではありませんが、劇的な節約ではありません。 – dandavis

+1

@dandavisこれについてのリンクを教えてください。私はそれについてもっと読んでみたいです。 –

+0

@ScottMarcus:それは広くはカバーされていません。 [the es3 spec](http://www.ecma-international.org/publications/files/ECMA-ST-ARCH/ECMA-262,%203rd%20edition,%20December%201999)の13.1.2の注記を参照してください。 pdf)SCOPEと関数オブジェクトの再利用について説明します。私はずっと前にいくつかのテストを行いました。その結果、工場とコンストラクタの間の節約が部分的に不足していることがわかりました。 – dandavis

答えて

1

プロトタイプを介してメソッドを委譲すると、同じ関数を複数コピーする必要がないため、メモリが節約されます。それはJavaScriptが実際に古典の継承をサポートしていないので、それはだ、JavaScriptので古典の継承よりも、プロトタイプを経て法の委任を使用することをお勧めします理由については

function A() { 
    this.hello = function() { 
    console.log('A new function is created in memory every time'); 
    console.log('an instance of A is created'); 
    }; 
} 

function B() { } 
B.prototype.hello = function() { 
    console.log('Only one function is created and every instance'); 
    console.log('of B shares this one function'); 
}; 

。古典的な継承を模倣していることは、まさにそのことです。模倣です。

1

古典的な継承よりもプロトタイプの継承が好まれているわけではありません。JavaScriptはコンパイルされた言語ではないため、別のアプローチが必要です。

プロトタイプにメソッド(ビヘイビア)を付けることによって、そのプロトタイプを使用するすべてのインスタンスに対して一度だけ格納されます。それらをインスタンスにアタッチする場合、各インスタンスは、他のインスタンスと変わらない動作を保存するために、より多くのメモリを占有します。

それらの値は、インスタンスへのインスタンスと異なる可能性があるため、通常、プリミティブを保存するプロパティ(文字列、数値、ブール値)は、インスタンスのプロパティとして作成されている理由は、これが(つまりp1.name =「スコット」、P2です。 name = "Mary")。しかし、関数を格納するプロパティはメソッド(ビヘイビア)をシミュレートし、値を返すビヘイビア(名前など)はインスタンスごとに変化しません。したがって、メソッドはプロトタイプに追加される傾向があります。例えば

は:さえES3を考慮

function Person(name){ 
 
    
 
     // This is an "instance property". Every time an instance 
 
     // of Person is created, that instance will store a name property 
 
     // in the object's memory. This type of property needs to be set up 
 
     // like this because each Person can/will have a different name. 
 
     this.name = name; 
 
    } 
 
    
 
    // This method always does the same thing, regardless of 
 
    // what instance it's dealing with, so it's better to store 
 
    // it just one time on the object that all Person instances 
 
    // will inherit from: 
 
    Person.prototype.getName = function(){ return this.name; } 
 

 

 
    // Both of these Person instances inherit from the same (one) Person 
 
    // prototype. 
 
    var p1 = new Person("Scott"); 
 
    var p2 = new Person("Mary"); 
 
    
 
    // So while each instance reserves space to store a name: 
 
    console.log(p1.name); // "Scott" 
 
    console.log(p2.name); // "Mary" 
 
    console.log(p1.hasOwnProperty("name")); // true 
 
    console.log(p2.hasOwnProperty("name")); // true 
 
    console.log(p1.hasOwnProperty("getName")); // false 
 
    console.log(p2.hasOwnProperty("getName")); // false 
 
    
 
    // Neither of those instances are storing the function for getName(). 
 
    // That is being stored just once in Person.prototype and p1 and p2 
 
    // are inheriting that behavior: 
 
    console.log(p1.getName()); // "Scott" 
 
    console.log(p2.getName()); // "Mary" 
 
    console.log(p1.hasOwnProperty("getName")); // false 
 
    console.log(p2.hasOwnProperty("getName")); // false 
 
    console.log(p1.__proto__.hasOwnProperty("getName")); // true

+0

古典的な継承(JavaScriptではなく)、メソッド委任はありません。サブクラスとスーパークラスへの参照があります。メソッドの委譲や古典的継承を使用する方が効率的ですか? – Yogesh

+0

@Yogeshその質問に対する答えはありません。古典的な継承は、事前コンパイルされた環境で動作しますが、JavaScriptはあらかじめコンパイルされていません。りんごとオレンジ。 JavaScriptでは、あなたは選択肢がありません - クラスは存在しません。古典的な言語(Java、C#など)では選択肢がありません。プロトタイプは存在しません。 –

+0

言語を実装するための継承のタイプ(古典的またはプロトタイプ)を選択する場合、考慮すべき要素は何ですか。それはあらかじめコンパイルされた環境ですか? – Yogesh

関連する問題