无法读取undefined的属性'prototype'; CoffeeScript继承与Require.js

时间:2013-12-20 14:32:30

标签: javascript coffeescript requirejs

我正在使用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之间有什么不同。

1 个答案:

答案 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()