0

重複の可能性:
プロトタイプを使用することの利点と、コンストラクターでメソッドを直接定義することの利点は?

JavaScriptのプロトタイププロパティを把握しようとしていますが、問題が発生しています。

私は次のようなチュートリアルに従いました。

「したがって、すべてのオブジェクトは自動的にsayHello()メソッド/関数を共有し、protoypeプロパティに割り当てる必要があります」。

言及された元のコードは次のとおりです。

function Pet(name, species, hello)
{
    this.name = name;
    this.species = species;
    this.hello = hello;
    this.sayHello = function()
    {
        alert(this.hello);
    }
}

そして、プロトタイププロパティを利用するために修正されたもの:

function Pet(name, species, hello)
{
    this.name = name;
    this.species = species;
    this.hello = hello;
}

Pet.prototype.sayHello = function()
{
    alert(this.hello);
}

これらの方法は両方とも同じ結果になるため、ここでの違いは何ですか(私が言えることから)。たとえば、以下のコードは、上記のいずれかとグループ化した場合も同じように機能します。

var rufus = new Pet("Rufus", "cat", "miaow");
rufus.sayHello();

どちらの場合も、これは「miaow」に警告します。

それで、誰かが私に違いを説明してくれますか、そしてなぜあなたはどちらかを選ぶのですか?

4

1 に答える 1

3

ここに私が最近それについて行った投稿があり、ここにデモがあります。デモでは、とがチェーンのTest2どこにあるかを見てみましょう。foobar

var Test2 = function() {              //foo attached via constructor
    this.foo = 'foo';                 //    each instance has "it's own" foo
}                    
Test2.prototype.bar = function() {};  //bar attached via prototype
                                      //    all instances "share" the same bar
var mytest2 = new Test2();

  (3) <-------- (2) <--------- (1) <- prototype chain
Object -> Test2 prototype -> mytest2
            '--> bar          '--> bar (from prototype)
                              '--> foo (from constructor)

基本的に、コンストラクターを介してアタッチされたものはすべてのインスタンスに表示されますが、「そのインスタンスに属します」。インスタンスからそのプロパティを変更すると、現在のインスタンスでのみ変更されます。

一方、prototypeis を介してアタッチされたものは、そのオブジェクトのすべてのインスタンスに表示され、「共有」されます。そのプロパティを変更すると、すべてのインスタンスのこのプロパティが変更されます。

于 2012-05-24T10:44:46.553 に答える