2

javascript でプライベート プロトタイプ メソッドを複製しようとしていて、このコードを見つけましたが、それ自体がどのように実装されているか完全には理解できません。

コードは...

var Foo = function () {};  

Foo.prototype = (function () {  

    // Private attributes  
    var somePrivateAttribute = 'Hello world';  

    // Private methods  
    function somePrivateMethod(val) {  
        alert(val);  
    }  

    // Public attributes and methods  
    return {  
        somePublicMethod: function () {  
            somePrivateMethod(somePrivateAttribute);  
        }  
    };  
})(); 

私が理解していないのは、このオブジェクトが開始さnew Foo()れたときに、自己実行関数のように毎回プロトタイプの新しいオブジェクトを作成することです? 私のプロジェクトでこれを使用することの利点と欠点を説明してください。

このタイプのパターンは、インスタンスが 500 個または 1 個しかないオブジェクトに対してどのように機能しますか?

この方法を使用すると、パフォーマンス上の利点はありますか?

4

3 に答える 3

3

私が理解していないのは、このオブジェクトが開始されたときです new Foo() は、自己実行関数にあるため、毎回プロトタイプの新しいオブジェクトを作成しますか?

いいえ。それがプロトタイプのポイントです。それらは複製されません。すべてのインスタンスが同じオブジェクトFooから継承されます。Foo.prototype

私のプロジェクトでこれを使用することの利点と欠点を説明してください。

命名に関して、少し誤解しているようです。これらの「プライベート」なものは、インスタンスオブジェクトとはまったく関係がないため、「属性」や「メソッド」ではありません。これらは、プロトタイプ オブジェクトに割り当てた関数からのみアクセスできる単なるローカル変数です。

JavaScript クロージャーはどのように機能しますか?を読みたいと思うかもしれません。およびIIFEでの使用。

このタイプのパターンは、インスタンスが 500 個または 1 個しかないオブジェクトに対してどのように機能するでしょうか。

全然大丈夫です。ただし、コンストラクター パターンを 1 つのインスタンスだけに使用するのは少し奇妙かもしれません。シングルトンはより簡単な方法で定義できます。

そのパターンの詳細を読みたい場合は、公開プロトタイプ パターンを検索してください。これは、プロトタイプ オブジェクトを作成するために適用される公開モジュール パターンです。

于 2013-04-14T23:20:48.933 に答える
2

私は前にそのパターンを見たことがなく、モジュール (それはそれが呼ばれるものです) を使用してprototype... しかし、ここに私がお勧めするものがあります; 似ていますが、モジュールにはすべてが含まれています。

var Foo = (function FooClass() {

  var privateVar = 'Hello world';  

  function privateFunc() {
    ...
  }

  function Foo() {}

  Foo.prototype = {
    publicMethod: function() {
      ...
    }
  };

  return Foo;

}());

var foo = new Foo();

私が理解していないのは、このオブジェクトが開始されたときです new Foo() は、自己実行関数にあるため、毎回プロトタイプの新しいオブジェクトを作成しますか?

自己実行関数は 1 回実行され、オブジェクトを返します。再度実行されることはありません。クロージャーを介して変数への参照を保持します。

于 2013-04-14T23:18:58.973 に答える
0

私が理解していないのは、このオブジェクトが開始されたときです new Foo() は、自己実行関数にあるため、毎回プロトタイプの新しいオブジェクトを作成しますか?

いいえ、Foo のプロトタイプへの割り当ては 1 回だけです。まったく問題はありません。少し型にはまらないだけです。

次のように書くこともできます (これも型破りですが、同じことを達成します)。

var Foo = function () {};  

Foo.prototype = new function() {  

    // Private attributes  
    var somePrivateAttribute = 'Hello world';  

    // Private methods  
    function somePrivateMethod(val) {  
        alert(val);  
    }  

    // Public attributes and methods  

    this.constructor = Foo;

    this.somePublicMethod = function () {  
        somePrivateMethod(somePrivateAttribute);  
    }  
}; 

Bergi が指摘したように、これはプロトタイプ チェーンに余分なオブジェクトを追加します。それを避けたい場合は、代わりに次のように記述できます。

var Foo = function () {};  

(function() {  

    // Private attributes  
    var somePrivateAttribute = 'Hello world';  

    // Private methods  
    function somePrivateMethod(val) {  
        alert(val);  
    }  

    // Public attributes and methods  

    this.somePublicMethod = function () {  
        somePrivateMethod(somePrivateAttribute);  
    }

}).call(Foo.prototype) 

プロトタイプを置き換えるのではなく変更することで、constructorプロパティもそのまま残ります。

于 2013-04-14T23:33:58.603 に答える