私はNode.jsを初めて使用し、それを学び始めました。
ノードの「events」モジュールで「EventEmitter」に出くわしました。
EventEmitterドキュメントの例に従った後、私は次のコードを記述しました。
var EventEmitter = require("events");
var util = require("util");
var Ticker = function(){
var self = this;
EventEmitter.call(self);
self.start = function(){
setInterval(function(){
self.emit("tick");
},1000);
}
self.on("tick",function(){
console.log("Keep Ticking");
});
}
util.inherits(Ticker,EventEmitter);
var ticker = new Ticker();
ticker.start();
コードを実行すると
node example03.js
出力は
rahul@ubuntu:~/rahul/NodePractise/EventEmitter$ node example03.js
Keep Ticking
Keep Ticking
Keep Ticking
Keep Ticking
^C
rahul@ubuntu:~/rahul/NodePractise/EventEmitter$
今、私がその行にコメントしても
//EventEmitter.call(self);
コードは正常に機能します。
それで、上記の行の目的は何ですか、そしてその存在はどのように重要です。
それで、上記の行の目的は何ですか、そしてその存在はどのように重要です。
コードの行:
EventEmitter.call(self);
これは、派生クラスの新しいインスタンスを作成するたびに、基本クラス(継承元)が独自のインスタンスを適切に初期化できるようにするためです。これは非常に重要なステップであり、省略してはなりません。
それが何をしているのかを正確に説明するために、それはEventEmitter
あなたが派生したオブジェクトのコンストラクター関数です。.call(self)
は、そのコンストラクター関数を呼び出し、this
作成されたばかりのオブジェクト(self
コード内でポイントされている)に値を設定するようにJavascriptに指示しています。それはあなたが望むものであるそれを呼び出すのとEventEmitter
同じ方法でコンストラクターnew EventEmitter()
を呼び出すことになります。ここでの唯一の違いnew EventEmitter()
はthis
、EventEmitter
オブジェクトだけでなく、派生オブジェクトのインスタンスを指していることです。
継承のすべての場合において、それ自体を適切に初期化できるように、基本クラスのコンストラクターを呼び出す必要があります。ただし、コンストラクターで実際にはあまり機能しないタイプのオブジェクトが存在する可能性があるため、省略した場合に動作する可能性があります。または、機能しているように見えるかもしれませんが、将来的には問題が発生します。
Nodeの例でEventEmitter.call(this)を追加または削除しても、違いはありません。なぜですか?
GithubのEventEmitterコードを見ると、EventEmitter
コンストラクターがこれを行っていることがわかります。
function EventEmitter() {
EventEmitter.init.call(this);
}
そして、.init()
メソッドはこれを行います:
EventEmitter.init = function() {
this.domain = null;
if (EventEmitter.usingDomains) {
// if there is an active domain, then attach to it.
domain = domain || require('domain');
if (domain.active && !(this instanceof domain.Domain)) {
this.domain = domain.active;
}
}
if (!this._events || this._events === Object.getPrototypeOf(this)._events) {
this._events = {};
this._eventsCount = 0;
}
this._maxListeners = this._maxListeners || undefined;
};
したがって、親コンストラクターの呼び出しに失敗すると、EventEmitterオブジェクトに適切に初期化されていないインスタンス変数がいくつかあります。これがコードに何をするかは誰の推測でもありますが(確実に知るには、さらにコードの調査とテストが必要になります)、それは良いことではありません。一部の機能はこの初期化なしで機能する可能性がありますが、他のものは正しく機能しない可能性が非常に高くなります。
この記事はインターネットから収集されたものであり、転載の際にはソースを示してください。
侵害の場合は、連絡してください[email protected]
コメントを追加