0

咖啡脚本代码:

class Animal
  constructor: (@name) ->

  move: (meters) ->
    alert @name + " moved #{meters}m."

class Snake extends Animal
  move: ->
    alert "Slithering..."
    super 5

alert Snake instanceof Animal

这是一个链接

我真的认为这个结果是真的。我的原因是__extends编译后的 JavaScript 中的这种方法:

__extends = function (child, parent) {
    for(var key in parent) {
        if(__hasProp.call(parent, key)) child[key] = parent[key];
    }function ctor() {
        this.constructor = child;
    }
    ctor.prototype = parent.prototype;
    child.prototype = new ctor();
    child.__super__ = parent.prototype;
    return child;
};

child.prototype.prototype是父母。

有人能告诉我为什么吗?我知道以下是正确的:

alert new Snake('a') instanceof Animal
4

1 回答 1

6

Snake是一个子类Animal

class Snake extends Animal

这意味着Snake(a "class") 实际上是 的实例Function,而不是AnimalSnake另一方面,对象将是 的实例Animal

alert Snake instanceof Function     # true
alert (new Snake) instanceof Animal # true

如果你试图让一个Snake实例移动:

(new Snake('Pancakes')).move()

您会看到调用了正确的方法。

演示:http: //jsfiddle.net/ambiguous/3NmCZ/1/

于 2012-07-16T16:17:44.770 回答