Javascript 为什么可以';t通过this指针设置prototype的value-type属性
我有以下Javascipt代码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
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
谢谢
杰弗里发生的事情是:
jack
对象中查找setAge
函数设置
,并将插孔
绑定到此设置。所以设置中的这个.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中定义的,但是它们的语法不同,在您的情况下,两者都不能使用。