3

以下のコードを使用して、モジュールパターンでプライベートメンバーフィールドを定義できます

    var myClass = function(){
       var private_field1,private_field_2;
       var private_func1 = function(){
            //.......
       } 
       //.........
       var myObj = {
         global_field1:2,
         global_field2:"something",
         global_func: function(){//......} 
       }
       return myObj;
    };
   var obj = myClass();

このメソッドは問題なく機能しますが、この問題の問題は、新しいオブジェクトを作成するたびに、すべての関数のコピーが作成されてメモリにロードされることです(同じクラスのすべてのオブジェクトが同じ関数メモリを共有するJavaとは異なります)

私は以下の他の方法を使おうとしました:

 var myClass = (function(){
           var private_field1,private_field_2;//private static fields
           var private_func1 = function(){
                //.......
           } 
           //.........
           var Constr = function(){
             //do something
           }
           Constr.prototype = {
             //................
             global_func: function(){//......} 
           }
           return Constr;
    }());
var obj1 = new myClass();
var obj2 = new myClass();

ただし、このメソッドの問題は、明らかにobj1、obj2がプライベートフィールドの同じコピーを共有することです(したがって、事実上、それらは静的です)。では、オブジェクトに同じ関数のコピーを使用しながら、モジュールパターンでプライベートフィールドを定義する方法はありますか?

そして、上記の最初のメソッドを継承するには、最初に子クラス内にオブジェクトを作成してから、そのオブジェクトを返す必要があります。

 var ChildClass = function(){
      var childobj = myClass();
      //override or add functions to childobj
      return childobj ;
 }

しかし、これは事実上、baseClassのオブジェクトをchildClassでラップしているだけです。これを(1番目または2番目のメソッドに対して)実装して、protected、privateなどのメソッドで真のJava継承のように機能できるようにする他の方法はありますか?

4

1 に答える 1

5

いいえ。JavaScriptのプライベート性は、スコープ(およびそれらからのエクスポート:クロージャ)によってのみ実行できます。

特権メソッドと呼ばれる、プライベート変数(および関数)にアクセスする必要のある関数は、コンストラクター内で定義する必要があります。(パブリックプロパティまたは他のメソッドとのみ相互作用する)これらのメソッドは、プロトタイプオブジェクトで定義する必要があるため、最終的には混合アプローチが得られます。発見した静的な値と組み合わされる可能性があります。

ところで、関数[コード]自体は何度もコピーされて記憶されるわけではありません。異なるスコープオブジェクト(字句環境)のみを保存する必要があります。

継承は通常、親オブジェクトを作成して拡張するのではなく、子インスタンスを作成して親のように拡張することによって行われます。これは、新しく作成された子に親のコンストラクターを適用することで実行できます。

function ChildClass() {
    ParentClass.call(this, /* … arguments */);

    // usual body, using "this"
}

また、子のプロトタイプは、親のプロトタイプオブジェクトから直接継承します。これは、 Object.createを介して実行できます(レガシーブラウザの場合はシムする必要があります)。

ChildClass.prototype = Object.create(ParentClass.prototype, {
    constructor: {value:ChildClass}
});
于 2012-09-17T16:17:41.283 に答える