2

私はここでいい問題を抱えています。これを理解する必要があります

Foo = function(){
};


Foo.prototype = {
buttons: new Array(),
index:'',
add: function(value)
{
    this.buttons.push(value);
},
clear:function(){
    this.buttons=new Array();
},
count:function(){
    return(this.buttons.length);
},
setIndex:function(index){
    this.index;
},
getIndex:function(index){
    return this.index;
}
};

var A= new Foo();
var B= new Foo();

A.add('toto');
B.add('tata');

A.setIndex(8);
B.setIndex(44);

alert(A.count()+"---"+A.getIndex());

そのコードは私に与えます:「2---8」!!

したがって、A.count() は A.count() + B.count() を返します。B.count() と同じ!!

誰かが私にこれを説明できますか、すでにこの問題がありましたか? 実行する方法 ?配列の「ボタン」が一意で、各オブジェクトに適している必要があります。

4

2 に答える 2

5

これは、プロトタイプの継承がどのように機能するかではなく、同じプロトタイプAを持ちます。Bこれは、同じbuttons配列を持つことを意味します。

JavaScript の継承はプロトタイプです。各「Foo」オブジェクトに個別のボタン配列を持たせたいのですが、それをFooプロトタイプに追加して、すべてのインスタンスで共有されるようにします。

これを変更できます:

var Foo = function(){
};

Foo = function(){
   this.buttons = []; //add an empty buttons array to every foo element.
};

別のclear方法として、最初にメソッドを呼び出し、新しいbuttons配列をインスタンス化します。

プロトタイプの継承は、主にプロパティではなく機能の共有に関するものであることに注意してください。各インスタンスに同じ機能を持たせたいFooが、それぞれに独自のbuttons配列を持たせたいとします。

役立つリソース:

これは、プロトタイプチェーンが MDN でどのように機能するかについての優れたチュートリアルです。

これは Addy Osmani (Google)の JavaScript パターンの本からのコンストラクター パターンに関する章です。

コードに関するその他のヒント:

構文new Array()は に短縮できます[]。実際にはsetIndex、インデックスを何にも割り当てていません。indexのコンストラクター関数でも宣言したほうがよいでしょうFoo

プロトタイプチェーンにそのようなプロパティが存在するオブジェクトのプロパティを設定すると、プロトタイプのプロパティを変更するのではなく、オブジェクトに新しいプロパティが作成されることに注意してください。

于 2013-03-08T19:33:01.643 に答える
1

プロトタイプで変数を定義すると、 のすべてのインスタンスで共有されますFooFooのインスタンスごとに配列のインスタンスを持つように、オブジェクト (関数) で動作を定義する必要がありますFoo

于 2013-03-08T19:34:34.507 に答える