gpt4 book ai didi

javascript - 为什么初始化的 JavaScript 对象不包含原型(prototype)对象?

转载 作者:塔克拉玛干 更新时间:2023-11-02 22:46:13 25 4
gpt4 key购买 nike

我尝试使用以下代码向对象添加 start 方法:

var Bounce = Bounce || {
Info : {},
Game : {}
};

Bounce.Game.prototype.start = function() {
Bounce.log("Starting " + new Bounce.Info());
}

但这会导致以下错误(在 Bounce.Game.prototype.start 行):

Uncaught TypeError: Cannot set property 'start' of undefined

查看 Chrome 控制台中的对象,我可以看到它不包含 prototype 对象(但有 toStringvalueOf构造函数等)。

这很容易通过在原型(prototype)访问之前添加以下行来解决:

Bounce.Game = function() {};

我不知道为什么在对象已经初始化的情况下还需要这样做?

W3Schools告诉我“每个 JavaScript 对象都有一个原型(prototype)”,但事实并非如此。

最佳答案

从概念上讲,所有对象都有原型(prototype),但只有函数对象(包括ObjectArray等构造函数,尽管它们不产生函数)有属性 名为原型(prototype)。它们不一样。

如果你阅读 ECMAScript 规范,原型(prototype)通常表示为 [[Prototype]],这是 JS 引擎的实现细节,而不是语言特性。然而,在一些引擎中,[[Prototype]] 被公开并且可以通过 __proto__ 属性(非标准)访问。


顺便说一句:

  1. 如果你想访问[[Prototype]]Object.getPrototypeOf() 是你的 friend 。

  2. 当使用a instanceof b时,它实际上是在比较a[[Prototype]]链和b prototype property

  3. 为什么我们说null是all的原型(prototype)?它也不是指 prototype 而是 [[Prototype]]:

    Object.getPrototypeOf(Object.getPrototypeOf({})) // null
    Object.getPrototypeOf(Object.getPrototypeOf(Object.getPrototypeOf([]))) // null
    Object.getPrototypeOf(Object.getPrototypeOf(Object.getPrototypeOf(new String("")))) // null

    // or shorter like this
    ({}).__proto__.__proto__ // null
    ([]).__proto__.__proto__.__proto__ // null
    ("").__proto__.__proto__.__proto__ // null

关于javascript - 为什么初始化的 JavaScript 对象不包含原型(prototype)对象?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27741148/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com