Javascript 为什么可以';t通过this指针设置prototype的value-type属性

Javascript 为什么可以';t通过this指针设置prototype的value-type属性,javascript,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 t

我有以下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

谢谢

杰弗里发生的事情是:

  • Intepreter在
    jack
    对象中查找
    setAge
    函数
  • 它不在那里,所以它在原型链中看起来更高一级。就在那里
  • Intepreter调用
    设置
    ,并将
    插孔
    绑定到此设置。所以
    设置中的
    这个.age
    杰克
    有关,而不是
    杰克原型
    。因此,杰克的年龄是25岁
  • 如果要修改某人的
    age
    属性,可以调用:

     Person.prototype.setAge(7);
    
    (现在
    这个
    将绑定到
    Person.prototype
    )。

    发生的是:

  • Intepreter在
    jack
    对象中查找
    setAge
    函数
  • 它不在那里,所以它在原型链中看起来更高一级。就在那里
  • Intepreter调用
    设置
    ,并将
    插孔
    绑定到此设置。所以
    设置中的
    这个.age
    杰克
    有关,而不是
    杰克原型
    。因此,杰克的年龄是25岁
  • 如果要修改某人的
    age
    属性,可以调用:

     Person.prototype.setAge(7);
    
    (现在,
    将绑定到
    Person.prototype

    我不明白为什么函数jack.setAge(25);赋值 对个人、原型、年龄

    将值分配给
    Person.prototype.age
    没有意义,因为此属性将被继承。如果此语句将该值赋给
    Person.prototype.age
    ,则从此继承的所有对象都将受到影响。这就是为什么浏览器实现
    this
    ,在本例中,to指的是实例对象(jack),而不是
    Person.prototype
    ,这就是

    当执行代码this.age=age;,似乎有一处新的房产在出售 添加到jack实例中

    我不明白为什么函数jack.setAge(25);赋值 对个人、原型、年龄

    将值分配给
    Person.prototype.age
    没有意义,因为此属性将被继承。如果此语句将该值赋给
    Person.prototype.age
    ,则从此继承的所有对象都将受到影响。这就是为什么浏览器实现
    this
    ,在本例中,to指的是实例对象(jack),而不是
    Person.prototype
    ,这就是

    当执行代码this.age=age;,似乎有一处新的房产在出售 添加到jack实例中


    为我工作如果你有两个人,并且函数设置为
    Person.prototype.age
    ,那么你最终的代码总是说他们都是最后一组age@Paul正当这也是我在回答“为我工作”时的意思。如果你有两个人,并且函数设置为
    Person.prototype.age
    ,那么你最终的代码总是说他们都是最后一组age@Paul正当这也是我在回答中的意思谢谢你的回答。对于get和set操作符,行为似乎有所不同。我标记为#1的代码是一个get操作符,解释器将查找原型链。函数setAge中的代码是一个set运算符。它只查找此实例所指向的实例所拥有的属性。这是javascript标准吗?@Jeffrey-
    .age
    .setAge()
    都是
    jack
    实例的属性。其中一个是数字(数字类型的实例),另一个是函数(函数类型的实例)。区别在于
    age
    是一个所谓的“自有属性”(这意味着它直接在
    jack
    对象中定义,不需要进行原型链查找),而
    setAge()
    是jack原型的一个属性。不要将它们与getter和setter混淆——它们是在ECMAScript 5中定义的,但是它们的语法不同,在您的情况下,两者都不使用。谢谢您的回答。对于get和set操作符,行为似乎有所不同。我标记为#1的代码是一个get操作符,解释器将查找原型链。函数setAge中的代码是一个set运算符。它只查找此实例所指向的实例所拥有的属性。这是javascript标准吗?@Jeffrey-
    .age
    .setAge()
    都是
    jack
    实例的属性。其中一个是数字(数字类型的实例),另一个是函数(函数类型的实例)。区别在于
    age
    是一个所谓的“自有属性”(这意味着它直接在
    jack
    对象中定义,不需要进行原型链查找),而
    setAge()
    是jack原型的一个属性。不要将它们与getter和setter混淆——它们是在ECMAScript 5中定义的,但是它们的语法不同,在您的情况下,两者都不能使用。