methodize
someFunction.methodize() -> Function
将原始函数方法化,返回一个新的函数,调用新函数时,实质是将原始函数的第一个参数设置为当前 this
所指向的对象,然后调用原始函数。
methodize
方法对原始函数进行转换,当调用时将原函数中第一个显式的参数设置为
this
(当前上下文),成为一个隐含参数。它常用于转换一个函数作为对象或对象原型(prototype
属性)的方法,并简化函数的签名。
样例
// 从一个直接操作目标对象的简单函数开始:
var fn = function(target, foo) {
target.value = foo;
};
var object = {};
// 使用原始函数
fn(object, 'bar');
object.value
//-> 'bar'
// 将 fn 方法化并赋给对象,它就变成对象的一个方法,这时只有一个参数:
object.fnMethodized = fn.methodize();
object.fnMethodized('boom!');
object.value
//-> 'boom!'
当然,样例中的用法并不常见。更常见的用法是复制已方法化的函数给对象的原型(prototype 属性),
以便新的方法可以立即在对象实例间共享。在 Prototype 库中,methodize
在 DOM
和事件模块中有着重要的应用:Element.Methods 和
Event.Methods 就是通过方法化后再放入它们原生的 prototype
属性中的,以便在 DOM 节点和事件对象中使用。
译注:想一下 Event.observe('inputId', 'click', handler)
到
$('inputId').observe('click', handler)
是如何转换的,是不是有一种恍然大悟的感觉呢?
var input = document.getElementById('inputId');
input.observe = Event.observe.methodize();
input.observe('click', handler);