为什么不能通过this指针设置原型的值类型属性

时间:2013-07-31 13:54:04

标签: javascript

我有以下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 实例的原型中找到年龄属性。打印 0

是合理的

在声明 jack.setAge(25); 时,执行代码 this.age = age; 时,似乎新属性被添加到 jack 实例。我很困惑为什么函数 jack.setAge(25); 将值赋给 Person.prototype.age

谢谢,

杰弗里

2 个答案:

答案 0 :(得分:4)

会发生什么:

  1. Intepreter在setAge对象中查找jack函数。
  2. 它不存在,所以它在原型链中看起来很高。就在那里。
  3. Intepreter调用与setAge绑定的jack。因此this.age中的setAgejack相关,而不是jack.prototype。因此jack.age = 25。
  4. 如果要修改Person的age属性,可以调用:

     Person.prototype.setAge(7);
    

    (现在this将绑定到Person.prototype)。

答案 1 :(得分:0)

  

我很困惑为什么不是函数jack.setAge(25);分配值   到Person.prototype.age?

将值赋给Person.prototype.age是没有意义的,因为要继承此属性。如果此语句将值赋给Person.prototype.age,则从此继承的所有对象都将受到影响。这就是为什么浏览器在这种情况下实现this来引用实例对象(jack),而不是Person.prototype这是

的原因
  

执行代码this.age = age;时,似乎是一个新属性   添加到插孔实例。