14

最近Node.jsを学んでいます。util.inheritsNode.jsの関数について質問があります。extendsそれを置き換えるためにcoffeescriptで使用できますか? そうでない場合、それらの違いは何ですか?

4

1 に答える 1

23

はい、代わりに使用できますextends

違いは?まず、CoffeeScript を見てみましょう。

class B extends A

この JavaScript に対してCoffeeScript コンパイラが生成する JavaScriptを見てみましょう。

var B,
  __hasProp = {}.hasOwnProperty,
  __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; };

B = (function(_super) {

  __extends(B, _super);

  function B() {
    return B.__super__.constructor.apply(this, arguments);
  }

  return B;

})(A);

したがって、はと__extendsの間の継承関係を宣言するために使用されます。BA

__extendsCoffeeScript で、もう少し読みやすく言い直しましょう。

coffee__extends = (child, parent) ->
  child[key] = val for own key, val of parent

  ctor = ->
    @constructor = child
    return
  ctor.prototype = parent.prototype

  child.prototype = new ctor
  child.__super__ = parent.prototype

  return child

( JavaScript にコンパイルし直すことで、これが忠実に再現されていることを確認できます。)

何が起こっているかは次のとおりです。

  1. で直接見つかったキーはすべて onparentに設定されchildます。
  2. ctorインスタンスのconstructorプロパティが子に設定され、そのprototype設定が親に設定された、新しいプロトタイプ コンストラクターが作成されます。
  3. 子クラスのprototypeは のインスタンスに設定されますctorctorconstructorは に設定されchildctorのプロトタイプ自体はparentです。
  4. 子クラスの__super__プロパティは、CoffeeScript のキーワードで使用するためにparent'sに設定されます。prototypesuper

ノードのドキュメントには、次のように説明さutil.inheritsれています。

あるコンストラクターから別のコンストラクターにプロトタイプ メソッドを継承します。コンストラクターのプロトタイプは、superConstructor から作成された新しいオブジェクトに設定されます。

さらに便利なことに、constructor.super_ プロパティを介して superConstructor にアクセスできます。

結論として、util.inheritsCoffeeScript のクラスを使用している場合は使用する必要はありません。CS が提供するツールを使用するだけで、superキーワードのようなボーナスが得られます。

于 2012-05-21T04:04:38.663 に答える