最近Node.jsを学んでいます。util.inherits
Node.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
の間の継承関係を宣言するために使用されます。B
A
__extends
CoffeeScript で、もう少し読みやすく言い直しましょう。
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に設定されます。prototype
super
ノードのドキュメントには、次のように説明さutil.inherits
れています。
あるコンストラクターから別のコンストラクターにプロトタイプ メソッドを継承します。コンストラクターのプロトタイプは、superConstructor から作成された新しいオブジェクトに設定されます。
さらに便利なことに、constructor.super_ プロパティを介して superConstructor にアクセスできます。
結論として、util.inherits
CoffeeScript のクラスを使用している場合は使用する必要はありません。CS が提供するツールを使用するだけで、super
キーワードのようなボーナスが得られます。