私は最近Node.jsを学んでいます。 Node.jsに関数util.inherits
に関する質問があります私はextends
をcoffeescriptで置き換えることができますか?そうでない場合、それらの違いは何ですか?coffeescriptの 'extends'とnode.jsの 'util.inherits'の相違点
14
A
答えて
23
はい、代わりにextends
を使用できます。
違いは?のは、CoffeeScriptのを見てから始めましょう:
class B extends A
はのは、このJavaScriptがthe JavaScript the CoffeeScript compiler producesを見てみましょう:
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
間の継承関係を宣言するのに使用されます。
のは、CoffeeScriptの中で、もう少し読み取り可能__extends
を言い換えるてみましょう:
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
(。あなたは、これがcompiling it back to JavaScriptによって忠実に再現していることを確認することができます)
ここで何が起こっているのかです:
parent
に直接見つかったすべてのキーはchild
に設定されています。- 新しいプロトタイプコンストラクタ
ctor
が作成され、そのインスタンスのconstructor
プロパティが子に設定され、そのprototype
が親に設定されます。 - 子クラスの
prototype
は、ctor
のインスタンスに設定されています。ctor
のconstructor
はchild
に設定され、ctor
のプロトタイプ自体はparent
です。 - 子クラスの
__super__
プロパティは、parent
のprototype
に設定され、CoffeeScriptのsuper
キーワードで使用されます。
次のようにutil.inherits
を説明:
を別に1つのコンストラクタからプロトタイプメソッドを継承。 コンストラクタのプロトタイプは、 superConstructorから作成された新しいオブジェクトに設定されます。
さらに便利なように、superConstructorはconstructor.super_プロパティを使用して にアクセスできます。
結論として、CoffeeScriptのクラスを使用している場合は、util.inherits
を使用する必要はありません。単にCSがあなたに与えるツールを使用すれば、super
のようなボーナスが得られます。
関連する問題