我尝试使用以下代码向对象添加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
对象(但有toString
,valueOf
和constructor
等。)
通过在原型访问之前添加以下行可以轻松解决此问题:
Bounce.Game = function() {};
我不知道为什么在对象初始化时这是必要的?
W3Schools告诉我“每个JavaScript对象都有一个原型”,但情况似乎并非如此。
答案 0 :(得分:4)
从概念上讲,所有对象都有原型,但只有函数对象(包括Object
,Array
等构造函数,尽管它们不生成函数)具有属性名为prototype
。它们不一样。
如果您阅读ECMAScript规范,原型通常表示为 [[Prototype]] ,这是一个实现细节,位于JS引擎中,而不是语言功能。但是,在某些引擎中, [[Prototype]] 会被公开,并且可以使用__proto__
属性(非标准)进行访问。
顺便说一下:
如果您想访问 [[原型]] ,Object.getPrototypeOf()
是您的朋友。
使用a instanceof b
时,它实际上将a
的 [[原型]] 链与b
的{{1}}进行比较的属性强>
为什么我们说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();