Javascript 为什么下面的代码'p.\u proto\u.aa'不等于200?
为什么Javascript 为什么下面的代码'p.\u proto\u.aa'不等于200?,javascript,prototype,Javascript,Prototype,为什么p.\uuuuuuuuuuuuu.home被更改。在我看来,p.aa=200已更改了p.\uuuu proto\uuuu.aa,但未更改 为什么知道原因?请写更多细节。 哪本书与内容相关?p.uu proto_uuu.home尚未更改。它引用的数组已更改。p.\uuuu proto\uuuuu.home未更改。它引用的数组已更改。当您试图访问对象上不存在的属性时,Javascript将遍历原型链以查找该属性。然而: function Person(name,age){ this.n
p.\uuuuuuuuuuuuu.home
被更改。在我看来,p.aa=200
已更改了p.\uuuu proto\uuuu.aa
,但未更改
为什么知道原因?请写更多细节。哪本书与内容相关?
p.uu proto_uuu.home
尚未更改。它引用的数组已更改。p.\uuuu proto\uuuuu.home
未更改。它引用的数组已更改。当您试图访问对象上不存在的属性时,Javascript将遍历原型链以查找该属性。然而:
function Person(name,age){
this.name = name
this.age = age;
}
Person.prototype.home = [1,2,3];
Person.prototype.aa =100;
var p = new Person('joy','7');
console.log(p.__proto__.home); //[1,2,3]
console.log(p.__proto__.aa); // 100
p.aa = 200;
p.home[0] = 200;
console.log(p.__proto__.home); //[200,2,3]
console.log(p.__proto__.aa); // 100
这会将属性aa
直接指定给对象。对象现在作为一个属性.aa
,并且它仍然作为两个独立的属性\uuuu proto\uuuuu.aa
。当您试图访问对象上不存在的属性时,Javascript将遍历原型链以查找该属性,而不是通过分配给.aa
来间接修改原型。然而:
function Person(name,age){
this.name = name
this.age = age;
}
Person.prototype.home = [1,2,3];
Person.prototype.aa =100;
var p = new Person('joy','7');
console.log(p.__proto__.home); //[1,2,3]
console.log(p.__proto__.aa); // 100
p.aa = 200;
p.home[0] = 200;
console.log(p.__proto__.home); //[200,2,3]
console.log(p.__proto__.aa); // 100
这会将属性
aa
直接指定给对象。对象现在作为一个属性.aa
,并且它仍然作为两个独立的属性\uuuu proto\uuuuu.aa
。通过分配给.aa
p.aa!==p、 prototype.aa
p.home===p.prototype.home?不是答案,但不建议使用双下划线proto-double-下划线(从形式上看)?我在一本书上读到过。@cresjoy:是的。你应该改用Object.getPrototypeOf(p).aa
,否则可能是更好的复制目标。任何金袋都可以随意修复。p.aa!==p、 prototype.aa
p.home===p.prototype.home?不是答案,但不建议使用双下划线proto-double-下划线(从形式上看)?我在一本书上读到过。@cresjoy:是的。你应该改用Object.getPrototypeOf(p).aa
,否则可能是更好的复制目标。任何一个金袋匠都可以随意修复它。基本上var p={aa:200},对吗?我们没有改变原型。(我不是op,只是想知道)好吧,你正在完全替换对象,这意味着它也在丢失它的\uuuuuuuuuuuuuuuuuuu
。。。忽略这个细节,是的,这就是你正在做的。你说失去proto是什么意思?你刚刚通过完全重新定义p
替换了整个对象。如果它是p.aa=200
在OP的代码中,整个对象没有被替换,那么后面添加的自己的属性不会覆盖原型链中已经存在的属性这一事实就是issue@cresjoyOP的p
具有p.\uuuu proto\uuuu.aa
。当您执行p={..}
时,新的p
现在没有p.\uu proto\uuu.aa
。基本上是var p={aa:200},对吗?我们没有改变原型。(我不是op,只是想知道)好吧,你正在完全替换对象,这意味着它也在丢失它的\uuuuuuuuuuuuuuuuuuu
。。。忽略这个细节,是的,这就是你正在做的。你说失去proto是什么意思?你刚刚通过完全重新定义p
替换了整个对象。如果它是p.aa=200
在OP的代码中,整个对象没有被替换,那么后面添加的自己的属性不会覆盖原型链中已经存在的属性这一事实就是issue@cresjoyOP的p
具有p.\uuuu proto\uuuu.aa
。当您执行p={..}
时,新的p
现在没有p.\uu proto\uuu.aa
。