我现在正试图了解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的赋值是否真的有什么作用?
而且,也许这是一个主观的问题,但如果是这样,为什么这不会抛出一个错误呢?
是不是简单的通过定义,让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模块(默认情况下是严格模式)来做到这一点。