2012-11-23 5 views
48

オブジェクトにメソッドを追加私はFooオブジェクトJavascriptが

がどのように私はbar()メソッドを追加することにより、このオブジェクトを拡張し、またFooの将来のインスタンスは、このメソッドを持っていることを確認することができたとし?

答えて

42

あなたはのFooのプロトタイプに追加する必要があります。

function Foo(){} 
Foo.prototype.bar = function(){} 
var x = new Foo() 
x.bar() 
10

JavaScriptのように再利用可能なオブジェクトを作成する方法はたくさんあります。以下はあなたの例で動作します

:Mozillaはここに素敵な紹介を持って

function Foo(){ 
    this.bar = function(){ 
     alert("Hello World!"); 
    } 
} 

myFoo = new Foo(); 
myFoo.bar(); // Hello World​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​ 
5

barを関数にする関数を作ることができます。それは単なる文字列、データ型やブール

Foo.bar = "a place"; 
39

このすべてを割り当てられるプロパティとして

Foo.bar = function(passvariable){ }; 

あなたがFooを作成しているかに依存し、どのように.bar()を使用する予定。

まず、オブジェクトにコンストラクタ関数を使用していますか?

var myFoo = new Foo(); 

もしそうなら、あなたはそのように、.barFoo機能のprototypeプロパティを拡張することができます。

function Foo() { /*...*/ } 
Foo.prototype.bar = function() { /*...*/ }; 

var myFoo = new Foo(); 
myFoo.bar(); 

をこのようにして、Fooの各インスタンスは、今SAMEへのアクセス権を持っています.barのインスタンス。ウィットに
.barthisへのフルアクセスを持っていますが、コンストラクタ関数内variables全くアクセスがあります:別の方法では

function Foo() { var secret = 38; this.name = "Bob"; } 
Foo.prototype.bar = function() { console.log(secret); }; 
Foo.prototype.otherFunc = function() { console.log(this.name); }; 

var myFoo = new Foo(); 
myFoo.otherFunc(); // "Bob"; 
myFoo.bar(); // error -- `secret` is undefined... 
      // ...or a value of `secret` in a higher/global scope 

を、あなたは任意のオブジェクトを返すように関数を定義することができ.barと、そのオブジェクトのプロパティとして作成(thisない)、この様式で

function giveMeObj() { 
    var private = 42, 
     privateBar = function() { console.log(private); }, 
     public_interface = { 
      bar : privateBar 
     }; 

    return public_interface; 
} 

var myObj = giveMeObj(); 
myObj.bar(); // 42 

、新しいオブジェクトを作成する関数があります。
これらのオブジェクトのそれぞれには、.bar関数が作成されています。
.bar関数は、特定のオブジェクトを返す関数内の "private"変数に、クロージャという名前でアクセスします。
.barはまだあなたがmyObj.bar();のような関数は常に(私の例Fooでは、public_interfacemyObjを参照します呼び出すthis、としてだけでなくthisへのアクセス権を持っています。

この形式の欠点は、これらのオブジェクトを何百万も作成しようとすると、それもメモリに食べられる.barの何百万ものコピーであるということです。

コンストラクタ内でthis.bar = function() {};を設定することもできます。また、コンストラクタ内のプライベート変数へのクロージャーアクセスが上限になり、メモリ要件が増えることになります。

だから最初の質問です:
は あなたの方法は、(thisまたはmyObj.Xを通じて)オブジェクト自体を介してアクセスすることができない「プライベート」のデータを、読み取り/変更するためのアクセス権を持っていることを期待しますか?

と2番目の質問は次のとおりです。メモリは大きな問題になるだろうように、あなたがそれらにそれぞれ自分の個人的な機能を与える場合 あなたは、これらのオブジェクトを十分に作っているのではなく、1を共有するためにそれらを与えますか?あなたはすべての三角形と、すべてのテクスチャハイエンドの3Dゲームで自分.draw機能を与えた場合

例えば、それはやり過ぎかもしれないが、それはおそらく...繊細なシステムではフレームレートに影響を与える

しかし、ページごとに5つのスクロールバーを作成し、それぞれのアプリケーションがその同じ位置を読み取り/設定するためのアクセス権を持たせることなく、それぞれの位置を設定し、ドラッグされているかどうかを把握できるようにしたい場合、あなたが既に10,000行(またはそれ以上)であるかもしれないと仮定して、5つの余分な関数があなたのアプリを殺すことになるのを恐れる理由は本当にありません。