【问题标题】:Why can you not set the prototype of builtin objects in javascript?为什么不能在javascript中设置内置对象的原型?
【发布时间】:2020-05-21 15:09:10
【问题描述】:

我目前正试图了解 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 中创建的所有事物创建某种代理,同时保留 Object 的原始原型。然后很好奇为什么不允许分配。

标签: javascript prototype internals


【解决方案1】:

是不是简单的定义,所以Object.prototype无论如何都是一样的?

是的。来自the specification

19.1.2.19 Object.prototype

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

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

[[Writable]] 为 false 意味着您不能通过赋值来更改它。 [[Configurable]] 为 false 意味着您无法通过 defineProperty 重新定义它。

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

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

不,什么都没有。

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

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

"use strict";
Object.prototype = null;

我建议始终使用严格模式。现在,您通过使用 JavaScript 模块(默认为严格模​​式)来做到这一点。

【讨论】:

    猜你喜欢
    • 2012-08-25
    • 1970-01-01
    • 1970-01-01
    • 2020-08-19
    • 1970-01-01
    • 2014-04-25
    • 2011-02-16
    • 2011-05-05
    • 2019-01-04
    相关资源
    最近更新 更多