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

问题描述 投票:0回答:1

我现在正试图了解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的赋值是否真的有什么作用?

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

javascript prototype internals
1个回答
6
投票

是不是简单的通过定义,让Object.prototype无论如何都是一样的?

是的。从 规格:

19.1.2.19 Object.prototype:

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

这个属性的属性{[[可写]]: false, [[可数]]: false, [[可配置]]: false }。

[[可写]]为false意味着你不能通过赋值来改变它。[[可配置]]为false意味着你不能通过以下方式对它进行重新定义 defineProperty.

这是真的。prototype 属性的内置构造函数。

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

没有,完全没有。

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

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

"use strict";
Object.prototype = null;

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

© www.soinside.com 2019 - 2024. All rights reserved.