4

私は Javascript の初心者で、codeAcademy の長い Javascript コースを終えたばかりです。よろしくお願いしprototypeます。prototypeそれは主に継承に使用され、オブジェクトにメソッドを動的に定義するためにも使用されることを理解しています。

しかし、まだいくつか質問があります。私のコードを見てください。toStringオブジェクトにa を定義し、プロトタイプを使用してAnimal別の も定義しました。toString実行すると、なぜ : が表示され、表示され[Object] Dumbo 4ないの[Proto] Dumbo 4ですか?

 function Animal(name, numLegs){
      this.name = name;
      this.numLegs = numLegs;

       this.toString = function(){
        return "[Object]" + this.name  + " " + this.numLegs + "\n";
        };
    }

    Animal.prototype.toString = function(){
     return "[Proto]" + this.name  + " " + this.numLegs + "\n";
    };

    var animal = new Animal("Dumbo", 4);
    console.log(animal.toString());
4

2 に答える 2

5

JavaScript はプロトタイプのオブジェクト指向プログラミング言語であり、単にオブジェクトが他のオブジェクトから継承することを意味します。JavaScript では、オブジェクトにプロパティが見つからない場合、インタープリターはオブジェクトのプロトタイプ チェーンでそれを見つけようとします。オブジェクトのプロトタイプチェーンにもオブジェクトが見つからない場合、インタプリタは以下を返しますundefined:

        null
          ^
          | [prototype]
          |
+------------------+
| Object.prototype |
+------------------+
          ^
          | [prototype]
          |
+------------------+
| Animal.prototype |
+------------------+
          ^
          | [prototype]
          |
   +------------+
   | new Animal |
   +------------+

ご覧のとおりvar animal = new Animal("Dumbo", 4)、 から継承してAnimal.prototypeいます。したがって、呼び出すと、コンストラクターanimal.toString()内で定義された関数が実行されます。Animalあなたがdelete animal.toString呼び出した場合、代わりanimal.toStringに呼び出しAnimal.prototype.toStringます。

JavaScript でのプロトタイプの継承の詳細については、次のブログ投稿をお読みください:なぜプロトタイプの継承が重要なのか

于 2013-10-10T09:31:46.047 に答える
0

オブジェクト自体で定義されたプロパティが、そのプロトタイプ チェーンのどこかで定義されたプロパティよりも優先されるのは当然のことです。

于 2013-10-10T09:17:55.483 に答える