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 的语句中,可以在jack实例的原型中找到age属性。打印0是合理的。

在声明jack.setAge(25); , 执行代码时this.age = age; ,似乎在jack实例中添加了一个新属性。我很困惑为什么不是函数jack.setAge(25); 将值分配给Person.prototype.age

谢谢,

杰弗里

4

2 回答 2

4

会发生什么:

  1. 解释器在对象中寻找一个setAge函数。jack
  2. 它不存在,因此它在原型链中看起来更上一层。在那里。
  3. setAge解释器调用jack绑定到 this。所以this.age在一个setAge涉及到jack,不是jack.prototype。因此jack.age = 25。

如果要修改agePerson 的属性,可以调用:

 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在这种情况下实现引用实例对象(jack)Person.prototype的原因,而不是

当执行代码 this.age = age; 时,似乎向 jack 实例添加了一个新属性。

于 2013-07-31T14:03:56.220 回答