0

Coffeescript コード:

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(「クラス」) は実際には のインスタンスであり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 に答える