3

私は CodeAcademy JS の演習に取り組んでおり、この例について質問があります。

//Animal class
function Animal(name) {
    this.name = name;
}

//Attach sayName method to Animal class
Animal.prototype.sayName = function() {
    console.log("Hi my name is " + this.name);
};

//create an animal object instance
var dog = new Animal('Barker');

//invoke a method attached to the prototype from the object instance
dog.sayName();

このコードの私の理解は次のとおりです。

  1. Animal()JS は、関数 (関数コンストラクター)の呼び出し前に new キーワードを使用した結果として、var dog が指す新しい Animal オブジェクト インスタンスを作成します。
  2. var dog オブジェクトのプロトタイプには、sayName()次の行にメソッドが関連付けられています。Animal.prototype.sayName = function()
  3. sayName()がクラスにアタッチされているため、関数コンストラクターを使用してクラスprototypeから作成されたすべてのオブジェクトでメソッドを使用できるようになりましたAnimalnew Animal()

これは、このコードで何が起こっているかを正しく理解していますか?

thisまた、次の動物オブジェクトをどのように指すかを理解しようとしていますthis.name:

Animal.prototype.sayName = function() {
    console.log("Hi my name is " + this.name);
};

Animal.prototype実際のオブジェクトを指していない:prototypeこのAnimalオブジェクト インスタンスのオブジェクト? もしそうなら、実際には から呼び出されているので、thisthis.name指すべきではありませんか?Animal.prototypesayName()Animal.prototype

のコンテキストについての私の理解は、関数を呼び出すオブジェクトthisthis常に指しているということです。ただし、この場合、dog.sayName()が呼び出されたときに をthis指し、コンソールに記録されたときにAnimalどのようthis.nameに等しいかを示します。'Barker'Animal.prototype がプロトタイプ オブジェクトを指していることを誤解しているかdog.sayName()thisまたはprototype.

この小さな例には複数の質問がありますが、ここで何が起こっているかを正確に把握することは、これらの基本的な概念を理解するのに本当に役立ちます。

4

3 に答える 3

2

【ポイント1~3】

これは、このコードで何が起こっているかを正しく理解していますか?

はい、お分かりのようですね。

Animal.prototype は実際のオブジェクト、つまりprototypeこのAnimalオブジェクト インスタンスのオブジェクトを指していませんか?

はい、prototypeオブジェクトはObjectインスタンスです。

もしそうなら、実際には から呼び出されているので、thisthis.name指すべきではありませんか?Animal.prototypesayName()Animal.prototype

いいえ、 のメソッドとして呼び出したからですdog

dog.sayName();

このように呼び出した場合、はい、this参照されAnimal.protoypeます。

Animal.protoype.sayName();

しかし、それはあまり役に立たないでしょう。

のコンテキストについての私の理解は、関数を呼び出すオブジェクトthisthis常に指しているということです。

そうではありません。ほとんどthisの場合、プロパティであるオブジェクトではなく、メソッドが呼び出されたオブジェクトを参照します。メソッドは実際には複数のオブジェクトのプロパティである可能性があるためthis、メソッドとして呼び出されたオブジェクトを動的に指します。

もちろん、thisメソッドとして呼び出されていない場合や、 を使用してバインドされた関数内など、他のコンテキストで他のものを参照できます.bind

于 2016-04-09T18:55:21.983 に答える
1

あなたは誤解しthisました。の値はthis、関数を作成するときに設定されません。これは追加の引数です。関数を呼び出すたびに、this値が変わる可能性があります。

メソッドの場合、this値はベース オブジェクトに設定されます。例えば、

dog.sayName(); // `this` is `dog`
({sayName: dog.sayName}).sayName(); // `this` is this new object
(0,dog.sayName)(); // `this` is undefined or the global object
于 2016-04-09T18:55:02.670 に答える