我正在使用Require.js和CoffeeScript。我发现了一个相当奇怪的错误。
我有以下定义:
define ->
{
Node: class
ChildNode: class extends @Node
Term: class
ChildTerm: class extends @Term
}
这会引发以下错误:
Uncaught TypeError: Cannot read property 'prototype' of undefined
但是,以下两者都可以正常工作:
define ->
{
Node: class
ChildNode: class extends @Node
}
define ->
{
Node: class
ChildNode: class extends @Node
Term: class
ChildTerm: class extends @Node
}
我的代码有什么问题,我无法扩展Term
?我看不出它和Node
之间有什么不同。
答案 0 :(得分:3)
但是,以下两者都可以正常使用
实际上他们没有。看看他们正在制作什么代码:
// [simplified, obviously]
function __extends(child, parent) {
child.prototype = Object.create(parent.prototype);
return child; // ^^^^^^^^^^^^^^^^
}
define(function() {
return {
Node: function _Class() {},
ChildNode: __extends(function _Class() {}, this.Node)
} // ^^^^^^^^^
})
你不能拥有Self-references in object literal declarations。
那么为什么像
Term
这样的子类化会抛出错误,而Node
却没有呢?
因为this
确实引用了全局对象。这确实有一个Node
属性:DOM Node
interface构造函数(尽管你是cannot subclass)。但是,对于Term
,您将undefined
传递给__extend()
。