3

これら2つのアプローチの違いは何だろうか。どちらも機能しますが、2番目のアプローチが望ましくない影響を与えるかどうかわかりませんか?

// A. Putting a prototype method outside the function declaration (what I would normally do)
var Cat = function(){
}

Cat.prototype.eat = function(){
    // implementation
}

// B. Putting a prototype method inside the function declaration (it works too but the scoping seems different)
var Cat = function(){

    Cat.prototype.eat = function(){
        // implementation
    }   
}
4

2 に答える 2

4

おそらく最初の例を実行したいと思うでしょう。どちらもまったく同じことを行っていますが、技術的には 2 番目の関数は Cat の「プライベート」変数にアクセスできます。ただし、それを行いたい場合は、次を使用するのが正しい方法ですthis

var Cat = function(){
    var a = 'hi';

    this.eat = function() {
        alert(a); // Exists!
    }
}

上記の例、または元の「B」の例では、新しい Cat を でインスタンス化するまで、eat 関数は存在しないことに注意してくださいnew Cat()Cat.eat()つまり、ユーティリティ メソッドのように、関数自体を呼び出したいだけの場合は、最初の例prototypeが適しています。

于 2012-08-07T07:39:10.703 に答える
1

すべてのオブジェクトにはプロトタイプがあります。プロトタイプ継承を使用すると、まったく新しいプロトタイプを割り当てることができます (従来の継承と同様)。

function Animal() {
    this.numLegs = 4;
}
function Cat() {
    // Implementation
}
Cat.prototype = new Animal();

var kitten = new Cat();
console.log(kitten.numLegs); // 4

または、変数とメソッドを現在のクラスのプロトタイプに直接追加します。

function Cat() {
    // Implementation
}
Cat.prototype.numLegs = 4;

var kitten = new Cat();
console.log(kitten.numLegs); // 4

2 番目の例ではeat、クラスが開始されるたびに関数を Cat プロトタイプに再割り当てするだけCatです。これは役に立ちませんが、古い値を上書きするだけなので、メモリを消費しません。

なぜこれが役立つのですか?関数はオブジェクトであることを忘れないでください。クラスのすべてのインスタンスについて、そのクラスで定義された各変数と関数は、独自のメモリを占有します。プロトタイプの継承を使用すると、共通のメソッドを共有できるため、インスタンスごとに余分なメモリを消費しません。

なぜこれがそれほど役に立たないのですか?プライベート変数にアクセスできません。

これは、次のように宣言できる静的メソッドと同じではないことに注意してください。

Cat.feed = function(kittens) {
    for (var kitten in kittens) {
        kitten.eat();
    }
};
于 2012-08-07T07:49:17.297 に答える