为什么可以从null更改Object.prototype。 proto 。
Object.prototype是没有原型的稀有对象之一,它不会继承任何属性(根据Flanagan)
我无法想象如何在现实生活中使用Object.prototype。 proto 。 请给我一个例子,为什么有必要改变它
答案 0 :(得分:2)
我无法想象如何在现实生活中使用
Object.prototype.__proto__
你不会在Object.prototype
本身使用它。 __proto__
是从Object.prototype
继承的所有对象继承的访问者属性。您可以使用它来获取甚至更改他们的原型(但不应该继续阅读)。 E.g:
class X {
}
let o = {};
console.log(o.__proto__ === Object.prototype); // true
o.__proto__ = X.prototype;
console.log(o instanceof X); // true
console.log(o.__proto__ === Object.prototype); // false

它主要是为了提供与网络上现有代码的兼容性,该代码在Mozilla的JavaScript引擎中使用JavaScript的专有扩展。不使用o.__proto__
,而是使用Object.getPrototypeOf(o)
和Object.setPrototypeOf(o, ...)
。 (事实上,正式的JavaScript引擎根本不应该有__proto__
,除非它们在网络浏览器中被使用。It's defined in 附件到规范,而不是规范本身,仅适用于Web浏览器JavaScript引擎。)
一般来说,甚至不使用Object.setPrototypeOf
。在构建对象之后更改对象的原型几乎总是指示设计问题。 (并且相对而言,对对象进行后续操作的速度非常慢。)
答案 1 :(得分:1)
这是关于Object.prototype的整个页面。 proto link请注意,它被用作getter和setter方法来公开对象的原型并且已被弃用赞成Object.getPrototypeOf和Object.setPrototypeOf。当您想要更改Objects原型的属性时,它有很多用途。
答案 2 :(得分:1)
为什么可以从
Object.prototype.__proto__
更改null
?
嗯,这是不可能的。在任何现代浏览器中自己尝试一下:
> Object.setPrototypeOf(Object.prototype, Object.create(null))
Uncaught TypeError: Immutable prototype object '#<Object>' cannot have their prototype set
这些immutable prototype exotic objects是随ES7引入的。