5

クロージャーを使用してコンストラクターを使用して作成されたこれら 2 つのオブジェクトの正確な違いは何ですか?ab

このプロパティは__proto__、クロージャーを使用して達成できないものに役立ちますか? これらの手法をさまざまな状況で使用する必要がありますか? メモリ使用量に違いはありますか?

( jsFiddle )

window.MODULE = {};

MODULE.constructor = function(){
        this.publicVariable = 10;
};
MODULE.constructor.prototype.publicMethod = function(){
    return this.publicVariable;
};
//-------------------------------//
MODULE.closure = (function(){
    var publicMethod = function(){
        return this.publicVariable;
    };
    return function(){
        var obj = {};
        obj.publicVariable = 10;
        obj.publicMethod = publicMethod;
        return obj;
    };
}());
//-------------------------------//
var a = new MODULE.constructor();
console.log("constructor", a.publicMethod(), a)
var b = MODULE.closure();
console.log("closure", b.publicMethod(), b)

また、いくつかのプライベート プロパティと静的プロパティを使用した、より複雑な jsFiddle の比較も参照してください。どちらの手法も、私が知る限り同じように機能します...

4

3 に答える 3

1

aOOP アプローチの利点をスキップすると、 と の違いbは、bが独自のメソッドを持ち、 がこのメソッドをプロトタイプから継承するpublicMethod場合です。a

a.hasOwnProperty('publicMethod'); // false
b.hasOwnProperty('publicMethod'); // true

__proto__そのプロパティは非標準であり、IE < 11 ではサポートされていないことに注意してください。代わりに、ES5 機能を使用することもできますObject.getPrototypeOf(a)

JavaScript 1の命名規則にも注意してください。

  • UPPER_CASEグローバルが通常使用する場合、定数に使用されるため、;PascalCaseにするMODULE必要があります。Module
  • コンストラクターも使用するためPascaleCase、.MODULE.constructorModule.Constructor
于 2013-10-07T13:15:14.173 に答える
0

プロトタイプ、継承、スーパーのオーバーライドと呼び出しの詳細: https://stackoverflow.com/a/16063711/1641941

MODULE={};
MODULE.constructor = function(){
  this.publicVariable = 10;
};
MODULE.constructor.prototype=(function(){
  var privateMethod=function(){
   console.log("I'm private");
  };
  return {
    publicMethod : function(){
      //going to call "private" method
      privateMethod();
      return this.publicVariable;
    }
  };
}());
var c = new MODULE.constructor();
c.publicMethod();

インスタンス固有の「プライベート」メンバー値を持つには、プロトタイプではなくコンストラクター関数本体でこれらの値にアクセスするすべての関数を定義する必要があるため、プロトタイプをあきらめる必要があります。個人的には、JavaScript でサポートされていないもの (プライベート インスタンス固有の変数) を強制的に実装し、JavaScript でサポートされているもの (プロトタイプ) をあきらめるのはばかげていると思います。

サポートされているとは、JS エンジンがコードを最適化することを意味します。

于 2013-10-07T15:49:15.183 に答える