2

これに違いはありますか:

function Foo(){
    this.bar = function(){
        console.log('hello');
    }
}
fooObj = new Foo();

この?

function Foo(){

}

Foo.prototype.bar = function(){
    console.log('hello');
}
fooObj = new Foo();

これらは同じように動作するように見えますが、プロトタイプについてはまだ完全には理解していません。foo.prototypeクラス外でメソッドを宣言する方法ですか?

4

3 に答える 3

7

最初の例では、そのコンストラクターで作成された新しいオブジェクトごとに新しい関数オブジェクトを作成し、それをプロパティに割り当てます。2 番目の例では、各新しいオブジェクトが参照する単一の関数を作成します。

これは、たとえば最初の例の場合

var fooObj1 = new Foo();
var fooObj2 = new Foo();

alert(fooObj1.bar === fooObj2.bar) //false

しばらくの間

alert(fooObj1.bar === fooObj2.bar) //true

これは、最初の例ではバーのプロパティが 2 つの別個の同一のオブジェクトを参照しているのに対し、2 番目の例ではそれらが同じであるためです。

一般に、そのコンストラクターで作成されたすべてのオブジェクト間で共有される「静的」オブジェクトを宣言する場合を除き、関数はプロトタイプで宣言してメモリを保持する必要がありますが、他のオブジェクトは個別に宣言する必要があります。

関数よりも通常のオブジェクトや配列との違いがわかりやすい

function Foo(){
    this.bar = [];
}
var fooObj1 = new Foo();
var fooObj2 = new Foo();

fooObj1.bar.push("x");
alert(fooObj2.bar) //[]

とは対照的に:

function Foo(){
}

Foo.prototype.bar = []
var fooObj1 = new Foo();
var fooObj2 = new Foo();

fooObj1.bar.push("x");
alert(fooObj2.bar) //["x"]
于 2013-03-25T17:18:05.490 に答える
3

基本的に、違いは次のとおりです。

....
this.bar = function(){
        console.log('hello');
    }
....

は、「クラス」の各インスタンスがFoo独自の を持つことを意味しますbar

....
Foo.prototype.bar = function(){
    console.log('hello');
}
....

Fooは、 「クラス」のすべてのインスタンスが1 つを共有することを意味しますbar。静的プロパティの並べ替え。

于 2013-03-25T17:19:08.970 に答える
-1

最初の例の bar メソッドは、foo を継承するコンストラクタから継承されません。また、最初の例では、foo によって作成されたオブジェクトは独自の bar のコピーを持ちますが、2 番目の例では、同じ bar のコピーを共有します。

オブジェクトがコンストラクターによって作成されると、コンストラクターのプロトタイプ プロパティを指す" proto " と呼ばれるプロパティが取得されます。proto」は、オブジェクトが指すプロトタイプ オブジェクトのすべてのプロパティをオブジェクトに継承させる JavaScript の特別なプロパティです。

于 2013-03-25T17:25:39.603 に答える