Nodeの例でEventEmitter.call(this)を追加または削除しても、違いはありません。なぜですか?

Rahul Shivsharan

私は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);

コードは正常に機能します。

それで、上記の行の目的は何ですか、そしてその存在はどのように重要です。

jfriend00

それで、上記の行の目的は何ですか、そしてその存在はどのように重要です。

コードの行:

EventEmitter.call(self);

これは、派生クラスの新しいインスタンスを作成するたびに、基本クラス(継承元)が独自のインスタンスを適切に初期化できるようにするためです。これは非常に重要なステップであり、省略してはなりません。

それが何をしているのかを正確に説明するために、それはEventEmitterあなたが派生したオブジェクトのコンストラクター関数です。.call(self)は、そのコンストラクター関数を呼び出し、this作成されたばかりのオブジェクト(selfコード内でポイントされている)にを設定するようにJavascriptに指示しています。それはあなたが望むものであるそれを呼び出すのとEventEmitter同じ方法でコンストラクターnew EventEmitter()を呼び出すことになります。ここでの唯一の違いnew EventEmitter()thisEventEmitterオブジェクトだけでなく、派生オブジェクトのインスタンスを指していることです

継承のすべての場合において、それ自体を適切に初期化できるように、基本クラスのコンストラクターを呼び出す必要があります。ただし、コンストラクターで実際にはあまり機能しないタイプのオブジェクトが存在する可能性があるため、省略した場合に動作する可能性があります。または、機能しているように見えるかもしれませんが、将来的には問題が発生します。


Nodeの例でEventEmitter.call(this)を追加または削除しても、違いはありません。なぜですか?

GithubEventEmitterコードを見ると、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]

編集
0

コメントを追加

0

関連記事

分類Dev

純粋なjavasctiptを使用して要素にIDを追加できないのはなぜですか?setattributeは関数ではありません

分類Dev

train_test_splitで「stratify」を使用しても違いはありません。それは何のために使われますか?

分類Dev

SASSSDがSATASSDよりも優れているのはなぜですか?または...そうではありませんか?

分類Dev

なぜJavaはそれを確認した後、種を負うものではありませんか?

分類Dev

私の間違いはどこにありますか?親行を削除または更新できません:外部キー制約が失敗します

分類Dev

vi を削除した後にこのエラーが発生するのはなぜですか? 「vi を使用している vim が見つかりません」

分類Dev

UIActionSheetStyleを変更しても、iOS7では違いはありませんか?

分類Dev

PySparkが既存のDataFrameに列を追加しています-TypeError:無効な引数であり、文字列または列ではありません

分類Dev

私は基本的なtoDoアプリに取り組んでいます。アイテムを長押しすると、リストから削除されますが、何も実行されません。私は何が間違っているのですか?

分類Dev

JOINSを間違って実行していますか、出力が期待どおりではありませんか?

分類Dev

画像を削除するべきではありませんが、削除するのはなぜですか?

分類Dev

このコードが機能しないのはなぜですか(URLは確かに問題ありません)が、何も起こりません

分類Dev

型キャスト、なぜそんなに冗長なのですか?それとも私は何か間違ったことをしていますか?

分類Dev

出力は私が期待したものではありません。誰かが私になぜそうなのか理解させることができますか?

分類Dev

DatabaseRefではなくQueryでkeepSynced()を使用しても違いはありますか?

分類Dev

ここで「エラー: 'undefined'は関数ではありません( 'items.split('、 ')'を評価しています)」と表示されるのはなぜですか?

分類Dev

指定された値はfloatの有効なインスタンスではありません。しかし、私はフロートを求めていません。どこが間違っているのですか?

分類Dev

でも、括弧などがある場合は、私の方法は、チェックするために、なぜ任意の理由が動作していませんか?

分類Dev

値変数を直接使用しないのはなぜですか、vs変数は必要ありません

分類Dev

ループなしで配列に数値を追加します。再帰を使用して解決しました。もっと良い方法はありますか?

分類Dev

(それは文字列の比較についてではありませんでした)なぜこのように印刷するのですか?

分類Dev

「入力文字列が正しい形式ではありませんでした」-なぜですか?

分類Dev

なぜこのコードは「コレクションが変更されました」をスローしますが、その前に何かを繰り返しても、そうではありませんか?

分類Dev

UNIXコンソールで、行を貼り付けて、z.txtにリダイレクトしたいのですが、可能ですか?そして、私がもう一度やったとき、それは追加すべきではありません

分類Dev

TypeErrorが発生するのはなぜですか:Reduxを使用しているときにObject(...)は関数エラーではありませんか?

分類Dev

display:blockを使用した入力はブロックではありません。なぜですか?

分類Dev

なぜFutureTaskは内部でもうAQSを使用していませんか?

分類Dev

ブール値に対する「++」演算子が定義されているのはなぜですか?ただし、「-」はC ++にはありません

分類Dev

this.setStateは、なぜ機能しなかったのかという関数ではありませんか?

Related 関連記事

  1. 1

    純粋なjavasctiptを使用して要素にIDを追加できないのはなぜですか?setattributeは関数ではありません

  2. 2

    train_test_splitで「stratify」を使用しても違いはありません。それは何のために使われますか?

  3. 3

    SASSSDがSATASSDよりも優れているのはなぜですか?または...そうではありませんか?

  4. 4

    なぜJavaはそれを確認した後、種を負うものではありませんか?

  5. 5

    私の間違いはどこにありますか?親行を削除または更新できません:外部キー制約が失敗します

  6. 6

    vi を削除した後にこのエラーが発生するのはなぜですか? 「vi を使用している vim が見つかりません」

  7. 7

    UIActionSheetStyleを変更しても、iOS7では違いはありませんか?

  8. 8

    PySparkが既存のDataFrameに列を追加しています-TypeError:無効な引数であり、文字列または列ではありません

  9. 9

    私は基本的なtoDoアプリに取り組んでいます。アイテムを長押しすると、リストから削除されますが、何も実行されません。私は何が間違っているのですか?

  10. 10

    JOINSを間違って実行していますか、出力が期待どおりではありませんか?

  11. 11

    画像を削除するべきではありませんが、削除するのはなぜですか?

  12. 12

    このコードが機能しないのはなぜですか(URLは確かに問題ありません)が、何も起こりません

  13. 13

    型キャスト、なぜそんなに冗長なのですか?それとも私は何か間違ったことをしていますか?

  14. 14

    出力は私が期待したものではありません。誰かが私になぜそうなのか理解させることができますか?

  15. 15

    DatabaseRefではなくQueryでkeepSynced()を使用しても違いはありますか?

  16. 16

    ここで「エラー: 'undefined'は関数ではありません( 'items.split('、 ')'を評価しています)」と表示されるのはなぜですか?

  17. 17

    指定された値はfloatの有効なインスタンスではありません。しかし、私はフロートを求めていません。どこが間違っているのですか?

  18. 18

    でも、括弧などがある場合は、私の方法は、チェックするために、なぜ任意の理由が動作していませんか?

  19. 19

    値変数を直接使用しないのはなぜですか、vs変数は必要ありません

  20. 20

    ループなしで配列に数値を追加します。再帰を使用して解決しました。もっと良い方法はありますか?

  21. 21

    (それは文字列の比較についてではありませんでした)なぜこのように印刷するのですか?

  22. 22

    「入力文字列が正しい形式ではありませんでした」-なぜですか?

  23. 23

    なぜこのコードは「コレクションが変更されました」をスローしますが、その前に何かを繰り返しても、そうではありませんか?

  24. 24

    UNIXコンソールで、行を貼り付けて、z.txtにリダイレクトしたいのですが、可能ですか?そして、私がもう一度やったとき、それは追加すべきではありません

  25. 25

    TypeErrorが発生するのはなぜですか:Reduxを使用しているときにObject(...)は関数エラーではありませんか?

  26. 26

    display:blockを使用した入力はブロックではありません。なぜですか?

  27. 27

    なぜFutureTaskは内部でもうAQSを使用していませんか?

  28. 28

    ブール値に対する「++」演算子が定義されているのはなぜですか?ただし、「-」はC ++にはありません

  29. 29

    this.setStateは、なぜ機能しなかったのかという関数ではありませんか?

ホットタグ

アーカイブ