最近Node.jsを学んでいます。util.inheritsNode.jsの関数について質問があります。extendsそれを置き換えるためにcoffeescriptで使用できますか? そうでない場合、それらの違いは何ですか?
1 に答える
はい、代わりに使用できます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 にコンパイルし直すことで、これが忠実に再現されていることを確認できます。)
何が起こっているかは次のとおりです。
- で直接見つかったキーはすべて on
parentに設定されchildます。 ctorインスタンスのconstructorプロパティが子に設定され、そのprototype設定が親に設定された、新しいプロトタイプ コンストラクターが作成されます。- 子クラスの
prototypeは のインスタンスに設定されますctor。ctorのconstructorは に設定されchild、ctorのプロトタイプ自体はparentです。 - 子クラスの
__super__プロパティは、CoffeeScript のキーワードで使用するためにparent'sに設定されます。prototypesuper
ノードのドキュメントには、次のように説明さutil.inheritsれています。
あるコンストラクターから別のコンストラクターにプロトタイプ メソッドを継承します。コンストラクターのプロトタイプは、superConstructor から作成された新しいオブジェクトに設定されます。
さらに便利なことに、constructor.super_ プロパティを介して superConstructor にアクセスできます。
結論として、util.inheritsCoffeeScript のクラスを使用している場合は使用する必要はありません。CS が提供するツールを使用するだけで、superキーワードのようなボーナスが得られます。