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;
それだけ。