为什么不能在javascript中设置内置对象的原型?

Why can you not set the prototype of builtin objects in javascript?

我目前正试图落后于 javascript 内部结构和原型设计。目前让我感到困惑的一件事是,当我将 Object.prototype 分配给某物时,它似乎实际上没有做任何事情,而不是当我为我定义的函数做同样的事情时(同样对于其他内置函数,如Function.prototype)。因此,当我在浏览器中 运行 以下内容时,我得到了一些意想不到的结果:

function A() {};
typeof A // "function"
console.log(A.prototype); // {constructor: ƒ} etc
A.prototype = null
console.log(A.prototype); // null
typeof Object // "function"
Object.prototype // {constructor: ƒ} etc
Object.prototype = null
Object.prototype // still {constructor: ƒ} etc, not null

这是为什么?是否只是根据定义,所以 Object.prototype 无论如何总是相同的?如果是这样,我对 Object.prototype 的分配实际上有什么作用吗?

而且,也许这是一个主观问题,但如果是这样,那为什么不抛出错误呢?

Is it simply by definition, so Object.prototype is always the same no matter what?

是的。来自 the specification:

19.1.2.19 Object.prototype

The initial value of Object.prototype is %Object.prototype%.

This property has the attributes { [[Writable]]: false, [[Enumerable]]: false, [[Configurable]]: false }.

[[Writable]] 为假意味着您无法通过赋值更改它。 [[Configurable]] 为 false 意味着您无法通过 defineProperty.

重新定义它

所有内置构造函数的 prototype 属性 都是如此。

And if so, does my assignment of Object.prototype actually do anything?

不,什么都没有。

And, perhaps this is a subjective question, but if so, why doesn't this throw an error then?

因为您使用的是松散模式。 :-) 在严格模式下,你会得到一个错误,因为在严格模式下分配给只读 属性 是一个错误:

"use strict";
Object.prototype = null;

我建议始终使用严格模式。这些天,你通过使用 JavaScript 模块(默认情况下是严格模式)来做到这一点。