【发布时间】:2015-02-28 17:24:23
【问题描述】:
我尝试使用以下代码向对象添加start 方法:
var Bounce = Bounce || {
Info : {},
Game : {}
};
Bounce.Game.prototype.start = function() {
Bounce.log("Starting " + new Bounce.Info());
}
但这会导致以下错误(在Bounce.Game.prototype.start 行):
未捕获的类型错误:无法设置未定义的属性“开始”
查看 Chrome 控制台中的对象,我可以看到它不包含 prototype 对象(但有 toString、valueOf 和 constructor 等)。
这很容易通过在原型访问之前添加以下行来解决:
Bounce.Game = function() {};
我不知道为什么在对象已经初始化时需要这样做?
W3Schools 告诉我“每个 JavaScript 对象都有一个原型”,但事实并非如此。
【问题讨论】:
-
从概念上讲,所有对象都有原型,但只有函数对象有
prototype属性。她们不一样。如果您阅读 ECMAScript 规范,原型通常表示为 [[Prototype]],这是 JS 引擎中的实现细节而不是语言功能。但是,在某些引擎中,[[Prototype]] 可以通过__proto__属性访问。 -
没有。每个对象都有一个原型。但是,它没有 named
prototype的属性。两种不同的东西。是的,这令人困惑。但它们的相关性在于函数的prototype属性成为使用该函数作为构造函数创建的新对象的实际原型。 -
确实应该注意
__proto__是非标准的——有更好的patterns。 -
@Leo 是对的,但是您将无法调用 Bounce.Game.start()。看看这个:jsbin.com/bapuvo/1/edit?html,js,console,output
-
确实很有趣的问题,很高兴它重新打开了。
标签: javascript object prototype