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

iot*_*tus 1 javascript prototype internals

我目前正在努力支持 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
Run Code Online (Sandbox Code Playgroud)

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

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

T.J*_*der 6

是不是简单地根据定义,所以 Object.prototype 无论如何总是相同的?

是的。从规范

19.1.2.19 对象.prototype

的初始值Object.prototype%Object.prototype%

此属性具有属性 { [[Writable]]: false, [[Enumerable]]: false, [[Configurable]]: false }。

[[Writable]] 为 false 意味着你不能通过赋值来改变它。[[Configurable]] 为 false 意味着您不能通过defineProperty.

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

如果是这样,我对 Object.prototype 的分配实际上有什么作用吗?

不,什么都没有。

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

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

"use strict";
Object.prototype = null;
Run Code Online (Sandbox Code Playgroud)

我建议总是使用严格模式。现在,您可以通过使用 JavaScript 模块(默认情况下是严格模式)来做到这一点。