Object.prototype .__ proto__不为null

时间:2018-02-03 18:56:31

标签: javascript

为什么可以从null更改Object.prototype。 proto

Object.prototype是没有原型的稀有对象之一,它不会继承任何属性(根据Flanagan)

我无法想象如何在现实生活中使用Object.prototype。 proto 。 请给我一个例子,为什么有必要改变它

3 个答案:

答案 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引入的。