9

Node.jsオブジェクトに events をキャストさせようとしています。「静的」オブジェクトを作成してインスタンス化する場合、これは問題ではありませんが、オブジェクトがオブジェクト リテラル表記を使用して作成されたときのように、オブジェクトに静的おじいちゃんがいない場合はどうすればよいでしょうか?

私は ExtJS 構文を書くのに慣れているので、すべてオブジェクト リテラルを好みます。

// var EventEmitter = require('events').EventEmitter; // How where when?

myObject = {
  myFunction: function() {
    console.log('foo');
  },
  urFunction: function() {
    console.log('bar');
  }
};

これはオブジェクトです。インスタンスを増やす必要がないため、コンストラクターはありません。

myObjectどうすればイベントの発行を許可できますか?

私はコードを適応させようと試みましたが、次のようなコンストラクターを使用してオブジェクトをフォームに書き換えずに動作させることはできません。

var EventEmitter = require('events').EventEmitter;
var util = require('util');

function myClass() {
  EventEmitter.call(this);

  myFunction: function() {
    this.emit('foo');
  },
  urFunction: function() {
    this.emit('bar');
  }
};

myClass.prototype = Object.create(EventEmitter.prototype);
// or // util.inherits(myClass, EventEmitter);
var myObject = new myClass; // Shouldn't be necessary for my single-instance case

または、次のように構築されたものに関数/プロトタイプを追加します。

var EventEmitter = require('events').EventEmitter;
var util = require('util');

var myObject = new EventEmitter();
// or // var myObject = Object.create(new EventEmitter); // Dunno difference
myObject.myFunction = function() {
    this.emit('foo');
  },
myObject.urFunction = function() {
    this.emit('bar');
  }
};

util.inherits(myObject, EventEmitter);

myObjectオブジェクトのリテラル表記を維持しながら、イベントを発行できるようにするにはどうすればよいですか? それを行うには非常に多くの紛らわしい方法がありますが、それらの JSONのような表記されたオブジェクト内の 1 つではありません。

4

3 に答える 3

9

継承の代わりに構成を使用しないのはなぜですか?

var myObject = {
  myFunction: function() {
    console.log('foo');
  },
  urFunction: function() {
    console.log('bar');
  },
  emitter: new EventEmitter()
}
于 2012-06-01T01:30:03.697 に答える
8

Unfortunately, your desired object-literal syntax is not possible. It's because

var obj = {};

is equivalent to

var obj = Object.create(Object.prototype);

in that obj's prototype is fixed to Object.prototype at creation and you can't change that later on.

Since you just want a single instance, I'd argue that it does make sense to create an instance of EventEmitter and assign properties to it:

var EventEmitter = require('events').EventEmitter;
var obj = new EventEmitter();

obj.doStuff = function() {
  this.emit('stuff');
};

You don't need util.inherits here, as you just have one instance, so there's no chain to setup.

于 2012-06-01T01:21:49.787 に答える
-1

私はブラウザ用のJavaScriptしかコーディングしていないので、これは完全に野蛮な推測です。ただし、オブジェクトリテラルを作成した後EventEmitterで、オブジェクトを呼び出すことはできませんか?

myObject = {
    myFunction: function() {
        console.log('foo');
    },
    urFunction: function() {
        console.log('bar');
    }
};
EventEmitter.call(myObject);
于 2012-05-31T16:27:13.823 に答える