2

次の Javascipt コードがあります。

var Person = function(){};
Person.prototype.age = 0;
Person.prototype.setAge = function(age) {
    this.age = age;
};

var jack = new Person();
console.log(jack.age); // #1
jack.setAge(25);  // Why not this function assign the value to Person.prototype.age.
console.log(jack.age); // #2
console.log(jack);

コードを実行した後、次のような出力が得られました。

0
25
Person {age: 25, age: 0, setAge: function}
age: 25
__proto__: Object
    age: 0
    constructor: function (){}
    setAge: function (age) {
    __proto__: Object

#1 というラベルの付いたステートメントで、ageプロパティがjackインスタンスのプロトタイプにあります。0を出力するのが合理的です。

jack.setAge(25);ステートメントで 、コードthis.age = age;を実行すると、jackインスタンスに新しいプロパティが追加されたようです。関数jack.setAge(25);ではない理由がわかりません。Person.prototype.ageに値を割り当てますか?

ありがとう、

ジェフリー

4

2 に答える 2

4

何が起こるか:

  1. インタプリタはオブジェクト内のsetAge関数を探しjackます。
  2. そこにないので、プロトタイプ チェーンの 1 レベル上に見えます。それはそこにある。
  3. setAgeインタプリタはこれにバインドして呼び出しますjack。したがってthis.age、ではなくにsetAge関連します。したがって、jack.age = 25 です。jackjack.prototype

Person のプロパティを変更する場合はage、次を呼び出すことができます。

 Person.prototype.setAge(7);

(今thisは にバインドされますPerson.prototype)。

于 2013-07-31T14:02:01.267 に答える
0

関数 jack.setAge(25); ではない理由がわかりません。Person.prototype.age? に値を割り当てますか?

Person.prototype.ageこのプロパティは継承されるため、値を に代入しても意味がありません。このステートメントが に値を代入するとPerson.prototype.age、これから継承するすべてのオブジェクトが影響を受けます。そのため、この場合、ブラウザーthisはインスタンス オブジェクト (ジャック) を参照するように実装します。Person.prototypeこれは理由ではありません。

コード this.age = age; を実行すると、jack インスタンスに新しいプロパティが追加されたようです。

于 2013-07-31T14:03:56.220 に答える