c4se記:さっちゃんですよ☆

.。oO(さっちゃんですよヾ(〃l _ l)ノ゙☆)

.。oO(此のblogは、主に音樂考察Programming に分類されますよ。ヾ(〃l _ l)ノ゙♬♪♡)

音樂は SoundCloud に公開中です。

考察は現在は主に Scrapbox で公表中です。

Programming は GitHub で開發中です。

自分のclassに、new Class().on('name', fn) みたいなEventEmitterを実装する (node.js)

Web browserでのJavaScriptでは、node.addEventListener(string, function(Event), boolean);と云ふ綴りを好くやる。event drivenと云ふ奴だ。node.jsでは、似たものでobject.on(string, function(*args));と云ふのを好く書く。event drivenと云ふ奴だ。
此のAPIを実装してゐるのは、event.EventEmitterと云ふ関数だ。
cf. Node.js - Node書くならEventEmitterについて知っとくべし - Qiita [キータ] http://qiita.com/yuku_t/items/d69d3a2c7dafa7d04e87
cf. Events Node.js v0.10.20 Manual & Documentation http://nodejs.org/api/events.html#events_class_events_eventemitter
或る関数に此のAPIを纏わせてやりたいのなら、上記の様にEventEmitterを返してやれば好い。

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

function sample() {
  var ev = new EventEmitter;

  return ev;
}

var ev = sample();
ev.on('call', function(v) { cansole.log(v); });
ev.emit('call', 42);

此うだ。
では此のAPIを、自分のobjectに纏わせてやりたければ??
難しく考へずに、prototype継承させてやれば好い。
cf. JavaScriptのprototype継承実験覺え書き http://c4se.hatenablog.com/entry/2012/10/17/005531

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

/**
 * @constructor
 * @extends {events.Eventemitter}
 * @prop {numner} x
 * @prop {number} y
 * @param {number} x
 * @param {number} y
 */
function Point(x, y) {
  Object.defineProperty(this, 'x', {
    get: function() { return x; },
    set: function(v) {
      x = v;
      this.emit('update', this);
    }
  });
  Object.defineProperty(this, 'y', {
    get: function() { return y; },
    set: function(v) {
      y = v;
      this.emit('update', this);
    }
  });
}

// JavaScriptのprototype継承実験覺え書き http://c4se.hatenablog.com/entry/2012/10/17/005531
Point.prototype = Object.create(EventEmitter.prototype);
Point.prototype.constructor = EventEmitter;

var p = new Point(42, 43);

p.on('update', function(p) { console.log([p.x, p.y]); });
p.x = 54;
p.y = 78;

それだけ。