-1

そのため、プロトタイプ メソッド内のプライベート メンバーへのアクセスのトピックについては、多くの議論がありました。以下が機能するはずだと思いました:

function Test(){
    var private = "Private";
    this.instance = function(){
        return private;
    };

    Test.prototype.getPrivate = function(){
        return private;
    };
}
var test1 = new Test();
var test2 = new Test();
console.log(test1.instance === test2.instance);  // false
console.log(test1.getPrivate === test2.getPrivate);  // true

実際、うまくいくことがわかりました。ただし、これを行うことには欠点があるのではないかと心配しています。

だから私の質問は:欠点はありますか?

4

2 に答える 2

4

test1getPrivate()test2のプライベートを取得するため、これはおそらく期待どおりには機能しません。

function Test(value){  
    var private = value;  
    this.instance = function(){ return private; };

    Test.prototype.getPrivate = function(){  
        return private;  
    };  
}  
var test1 = new Test("test1");  
var test2 = new Test("test2");
console.log(test1.getPrivate()); // test2
console.log(test2.getPrivate()); // test2

したがって、機能しないため、非効率的であっても問題ありません。

于 2012-09-29T02:09:50.060 に答える
0

関数自体の内部でプロトタイプ関数を定義する際に間違いを犯したと思います。このように、インスタンスが生成されるたびに、すべてのインスタンスで使用できるプロトタイプ メソッドが上書きされます...これは奇妙なことだと思います。

function Test(param){
    var private = param;

    this._getPrivate = function(){
        return private;
    };    
}
Test.prototype.getPrivate = function(){
    return this.instance();
};     
var test1 = new Test("One");
var test2 = new Test(2);
console.log(test1.getPrivate());
console.log(test2.getPrivate());

これは期待どおりに機能します。

しかし、その後、プロトタイプ関数が何のために必要なのかわかりません...クロージャーをメンバー関数として定義しただけの場合(ローカルにするのではなく、これに追加する)、同じ構文が得られますプロトタイプを使用する場合と同様。うーん、意図したとおりの結果が得られませんでした。プロトタイプをいじっていたのでしょうか?? gg

しかし、プロパティへのアクセスに興味がある場合は、このコード (EcmaScript 5 defineProperty) を見てください。methinks から取り出した素晴らしいプロトタイプ ツール (プロトタイプの欠点はありません) Sugar ... (彼らは実際にそれを使用してPropertyChange でイベントを有効にします!とにかく、レガシー ブラウザー <-> ES 5 では動作しません!)

Object.defineProperty(myObj, MyProp, {
    'enumerable'  : true,
    'configurable': true,
    'get': function() {
      return value;
    },
    'set': function(to) {
      value = calculateSomething(to);
    }
 });
于 2012-11-14T00:10:49.493 に答える