在浏览器中有一些预先构建的全局对象(对象、字符串、数字、日期等).所有这些全局对象的母亲都是“对象”。因为,这个对象是JS中几乎所有数据类型的原型(只有2- null和未定义的数据类型除外)。
现在,在创建任何数据类型的变量之后,我们将使用__proto__向上爬升。但是,当我们反应“对象”时,__proto__指向null,而"prototype-chain“有一个结尾!
直到现在,我还以为prototype和__proto__是一样的。今天,我发现,在Global-Object中,虽然__proto__指向null,但[[prototype]] (在get proto和set proto中)由大量其他值组成。
有人能区别我吗,__proto__和[[prototype]]之间到底有什么区别,为什么两者的值是完全不同的?虽然我认为这两件事是1和相同的!

我也读过这样的文章:和[[原型]]在javascript中,但是当它说__proto__ === [[prototype]]的时候,它变得更困惑了,但是接着说了一些内部插槽的东西?现在,我能得到一个简单明了的答案吗?
另外,如果__proto__是null,那么get __proto__如何获取任何结果?--这不是很荒谬吗?只有在存在任意值的情况下,它才会获取结果,而不是null。
发布于 2022-02-05 10:28:31
在你分享的截图中,你比较了两件无关的事情。
第一个框显示从访问__proto__获得的值。它确实是null。但是要注意,通过调用getter来检索此值。__proto__不是普通属性,它是使用getter和setter实现的。这意味着当你写:
var a = x.__proto__;..。一个函数被调用。这是get __proto__函数。此函数是在x的原型链中定义的方法(实际上是在Object.prototype上定义的)。
同样,如果您写:
x.__proto__ = a;调用...a函数。这是set __proto__函数。
屏幕截图中的第二个框显示了这个set __proto__函数对象的属性。请记住,函数也是对象。这个对象和你截图的主要对象没有什么关系。
还可以使用以下脚本访问这些getter和setter函数的定义:
let descriptor = Object.getOwnPropertyDescriptor(Object.prototype, "__proto__");
console.log(descriptor);
https://stackoverflow.com/questions/70996956
复制相似问题