2011-02-14 11 views
1

この特定のコンストラクトの名前はありますか?例で

function foo() { 
    var bar = this.bar = function() { 
     return "bar"; 
    }; 
    this.mybar = function() { 
     return bar(); 
    } 
} 
var myFoo = new foo(); 
myFoo.bar = function() { 
    return "notbar"; 
}; 
myFoo.bar(); // returns 'notbar' 
myFoo.mybar(); // returns "bar" 

は、基本的には、外部アクセスのために上書きされる可能性と、クロージャ内部のプライベートメソッドを可能にします。したがって、元の関数への参照は、クロージャ内のその関数の参照のために決して変更されません。しかし、クロージャーオブジェクトのインスタンシエーターは、そのオブジェクトの機能性を損なうことなくその機能を上書きすることができます。

この特定のコンストラクトの名前はありますか、それは役に立ちますか?

+0

これ以上のJavaScriptのように見えます。 – ulidtko

答えて

3

あなたは、その後、ローカル変数に機能を割り当て、別のパブリックメソッドでこの機能を使用して参照する場合、はい、これでしょうデータのカプセル化のいくつかのフォーム。それとは別に、私は特別な名前がないと言っています。
var barは、関数のローカル変数であり、this.barは新しいオブジェクトのプロパティです。変数とプロパティの名前は同じですが、関連はありません。 を公開してアクセスできるようにし、他の機能が正しく動作するようにしたい場合にのみ便利です。barが上書きされている場合です。

したがって、他の機能を保護する何らかの形ですが、外部上書きを許可する特別なパターンではありません。

this.barの唯一の目的を上書きする場合は、あなたが同じことを達成したい:あなたはそれに機能を割り当てる前に、あなたはmyFoo.bar()を呼び出す場合、その後、あなたが得る、

もちろん
function foo() { 
    var bar = function() { 
     return "bar"; 
    }; 
    this.mybar = function() { 
     return bar(); 
    } 
} 
var myFoo = new foo(); 
myFoo.bar = function() { 
    return "notbar"; 
}; 
myFoo.bar(); // returns 'notbar' 
myFoo.mybar(); // returns "bar" 

エラー。

関連する問題