为什么初始化的JavaScript对象不包含原型对象?

时间:2015-01-02 11:07:29

标签: javascript object prototype

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

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

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

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

  

未捕获的TypeError:无法设置未定义的属性“start”

在Chrome控制台中查看该对象,我发现它不包含prototype对象(但有toStringvalueOfconstructor等。)

通过在原型访问之前添加以下行可以轻松解决此问题:

Bounce.Game = function() {};

我不知道为什么在对象初始化时这是必要的?

W3Schools告诉我“每个JavaScript对象都有一个原型”,但情况似乎并非如此。

2 个答案:

答案 0 :(得分:4)

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

如果您阅读ECMAScript规范,原型通常表示为 [[Prototype]] ,这是一个实现细节,位于JS引擎中,而不是语言功能。但是,在某些引擎中, [[Prototype]] 会被公开,并且可以使用__proto__属性(非标准)进行访问。


顺便说一下:

  1. 如果您想访问 [[原型]] Object.getPrototypeOf()是您的朋友。

  2. 使用a instanceof b时,它实际上将a [[原型]] 链与b的{​​{1}}进行比较的属性

  3. 为什么我们说prototype是所有人的原型?它也不是指null而是 [[原型]]

    prototype

答案 1 :(得分:2)

因此,受到@Leo评论的启发,我想到了这个解决方案,可以使用普通的{}对象及其原型。

我们有这个对象:

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

我们定义给定对象的prototype属性

Object.defineProperty(Bounce.Game, 'prototype', {
    get: function() {
      return Object.getPrototypeOf(Bounce.Game); 
    }
});

现在,我们可以像往常一样使用原型:

Bounce.Game.prototype.start = function(){
  console.log('start');
};

Bounce.Game.start();

检查出来:http://jsbin.com/bapuvo/3/edit