Javascript 为什么这些对象的内容不一样?

Javascript 为什么这些对象的内容不一样?,javascript,Javascript,我在“原型突变”的标题下研究这个MDN 我正在将下面的代码片段复制到浏览器的控制台中 为什么o1: A o1={} 让{color:“red”}; o1={{uuuuuuuuuuuu}; 控制台日志(o1)参考: 不使用“冒号”表示法的属性定义不可用 原型突变。它们是行为规范的属性定义 与使用任何其他名称的类似定义相同 设o0={}; console.log('o0:'+o0.hasOwnProperty('uuu proto'uu'); //裸对象没有名为“\uuuu proto\uuuu

我在“原型突变”的标题下研究这个MDN

我正在将下面的代码片段复制到浏览器的控制台中

为什么
o1

A

o1={}
让{color:“red”};
o1={{uuuuuuuuuuuu};
控制台日志(o1)参考:

不使用“冒号”表示法的属性定义不可用 原型突变。它们是行为规范的属性定义 与使用任何其他名称的类似定义相同

设o0={};
console.log('o0:'+o0.hasOwnProperty('uuu proto'uu');
//裸对象没有名为“\uuuu proto\uuuu”的属性
让{color:“red”};
设o1={{uuuuuuuuuu};
//基于上面的o0,简写变量表示法基本上阻碍了它的使用
//作为底层原型的访问器。相反,其结果是__
//成为o1的一个属性,正如人们从速记符号中所期望的那样。。。
const newO1=Object.create(o1);
console.log('o1:'+o1.hasOwnProperty('uuu proto'uu');
console.log('newO1:'+newO1.hasOwnProperty('uuuu proto'uuuu');
console.log('newO1:'+newO1.color);
设o2={};
setPrototypeOf(o2,{color:“red”});
const newO2=Object.create(o2);
log('newO2:'+Object.keys(newO2));
console.log('newO2:'+newO2.color);
设o3={{uuuuuuuuuuuuuuuuu:{color:'red'}};
const newO3=Object.create(o3);
console.log('newO3:'+Object.keys(newO3));
console.log('newO3:'+newO3.color);
//更详细的冒号符号会触发解释器知道这一点
//您打算对原型进行变异,因此使用_uproto_uuu作为访问器,而不是

//正在将_proto__.创建为属性
。您正在与
Object.prototype
中的旧属性冲突。如果你不理解原型链,你应该阅读一篇关于它的教程(对于javascript来说非常重要)。更详细地说,区别在于
o1.hasOwnProperty(“'uuuu proto'uuu')==true
,和
o2.hasOwnProperty('uuuu proto'uuu')==false
。谢谢@ASDFGerte。我想说我知道原型链。我怀疑
\uuuu proto\uuuuu
o1
的一个直接属性,但它在Chrome控制台上的表现与我见过的其他直接属性不同。我唯一的问题是为什么
o1
有一个名为
\uuuu proto\uuuu
的直接属性,为什么
{color:“red”}被保存在
o2`的原型下。MDN页面有答案吗?另一方面,我不知道你是否有这种误解,但原型链中存在两次的属性没有问题:
let o=Object.create({prop:'value'});defineProperty(o,'prop',{value:'noU'});log(`Self:${o.prop},proto:${Object.getPrototypeOf(o.prop}`)。这还提供了一个“如何显式添加/修改对象本身的属性”的示例。@ASDFGerte我刚刚做了一个小测试,看看点表示法是否会改变对象的原型,而括号/文字表示法不会<代码>o={color:“red”};setPrototypeOf(o,{shape:“square”});o、 shape=“三角形”不幸的是,我的点表示法只添加了一个新的“own”属性,并没有更改存储在对象原型中的同一命名属性:/你是对的,我以前的说法完全错了。我一定是半睡半醒了<代码>\uuuu proto\uuuu
不过是一个“访问器属性(getter函数和setter函数)”。谢谢@dynamisticsponge。你能参考我的例子向我解释一下吗?我不确定哪一个是冒号符号。我得到2和3。如果我了解1(使用“速记属性名称符号-不是冒号变异”)的情况,
o1
s
\uuuuuu proto\uuuu
不会被更改
o1
有自己的属性:
\uuuu proto\uuuu:{color:“red”}
。通常,当规则是一个对象不能有两个名称相同的键(我知道最后一个键会覆盖前一个键)时,这怎么可能(我在问题的底部添加了Chrome显示给我的图片
o1
)。再次更新显示o0并添加一些注释…“proto”从技术上讲不是对象的属性,因此语法是您打算使用它来修改原型的唯一方法…而且由于它的使用已被弃用,我猜他们没有更新标准以允许在ES6Thanks@dynamisticsponge中使用速记符号。我很抱歉仍然不太清楚为什么
new01
是我控制台中的方式(我回答中的第二张图片)
说到这里,我知道
\uuuuu proto\uuuuuu
已经被弃用了,所以我会尽量避免遇到这些麻烦。第二张图..显示了新的o1…因此根据上面的讨论,o1最终成为一个属性为
\uuuuu proto\uuuuuuuu
的对象。当您执行object.create(o1)时结果对象使用o1作为其原型…所以new01.prototype=o1,所以要变成红色,您必须执行
newO1.prototype.\uuuu proto\uuuu.color