JavaScript the good parts P64~65に載っているeventuality関数について書いていく。
var eventuality = function(that) {
var registry = {};
that.fire = function(event) {
// Fire an event on an object. The event can be either
// a string containing the name of the event or an object
// containing a type property containing the name of event.
// Handlers registered by the 'on' method that match the
// event name will be invoked.
var array;
var func;
var handler;
var i;
var type = typeof event === 'string' ? event : event.type;
// If an array of handlers exist for this event, then
// loop throught it and execute the handlers in order.
if (registry.hasOwnProperty(type)) {
array = registry[type];
for (i = 0; i < array.length; i += 1) {
handler = array[i];
// A handler record contains a method and an optional
// array of parameters. If the method is a name, look
// up the function.
func = handler.method;
if (typeof func === 'string') {
func = this[func];
}
// Invoke a handler. If the record contained parameters,
// then pass them. Otherwise, pass the event object.
func.apply(this, handler.parameters || [event]);
}
}
return this;
};
that.on = function(type, method, parameters) {
// Register an event. Make a handler record. Put it
// in a handler array, making one if it doesn't yet
// exist for this type.
var handler = {
method: method,
parameters: parameters
};
if (registry.hasOwnProperty(type)) {
registry[type].push(handler);
} else {
registery[type] = [handler];
}
return this;
};
return that;
};
--JavaScript the good parts P65から引用 ここから--
任意のオブジェクトを引数にeventuality関数を呼び出すことで、それらのオブジェクトにイベントハンドリングを行うメソッドを追加することができる。この関数をコンストラクタ内でthatを返す前に呼び出してしまうこともできる。
--JavaScript the good parts P65から引用 ここまで--
私が理解できなかったのは、「この関数をコンストラクタ内でthatを返す前に呼び出してしまうこともできる。」とは何を言っているのか?
「eventuality関数に引数を渡してコンストラクタ関数の中で呼び出すである。これにより、コンストラクタ関数が新しいオブジェクトを作成し、それに対してイベント関連の機能を追加した後で、そのオブジェクトがコンストラクタ関数から返される。」ということを言いたいみたいだな。
使用例は次のようになると思われる。
function MyConstructor() {
// 新しいオブジェクトを作成
var newObj = {};
// newObjにイベント関連の機能を追加
eventuality(newObj);
// オブジェクトを返す
return newObj;
}
// eventualityを使ってオブジェクトを作成し、それに対してイベント関連の機能を追加
var instance = new MyConstructor();
// イベントを登録する
instance.on('someEvent', function(event) {
console.log('Event handler: ' + event.type);
});
// イベントを発火する
instance.fire({
type: 'someEvent'
});