这个对象就是对function的一些扩充,最重要的当属bind方法,prototype的帮助文档上特意说了一句话:Prototype takes issue with only one aspect of functions: binding.其中wrap方法也很重要,在类继承机制里面就是利用wrap方法来调用父类的同名方法。 argumentNames bind bindAsEventListener curry defer delay methodize wrap
var obj = { name: 'A nice demo', fx: function() { alert(this.name); } }; window.name = 'I am such a beautiful window!'; function runFx(f) { f(); } //其中__method就相当于obj.fx var fx2 = obj.fx.bind(obj); runFx(obj.fx); //I am such a beautiful window! runFx(fx2); //A nice demo /* 这里如果我们不在runFx函数里面调用f(),而是直接在外面调用obj.fx()那么得到的结果将是'A nice demo'。 其实如果我们这样写:var f=obj.fx;f();那也将得到‘I am such a beautiful window!'。 通过上面的例子,我们应该能看出上下文的概念: obj.fx(); //上下文为:obj f(); //上下文为:window 可以看出上下文其实就是最后一个'.'之前的那个对象,如果直接调用函数则上下文为window */
最后返回一个应用于context上下文的匿名函数。 注意:var a = merge(args, arguments);这句话里面的arguments和args = slice.call(arguments, 1);里面的arguments是不一样的。看一下例子:
var F=function(){alert(Array.prototype.slice.call(arguments,0).join(' '))}; F.curry('I').curry('am').curry('never-online').curry('http://www.never-online.net')(); //I am never-online http://www.never-online.net
// clearing a timeout var id = Element.hide.delay(5, 'foo'); window.clearTimeout(id);
wrap方法: Returns a function “wrapped” around the original function. Function#wrap distills the essence of aspect-oriented programming into a single method, letting you easily build on existing functions by specifying before and after behavior, transforming the return value, or even preventing the original function from being called. 这句话:var a = update([__method.bind(this)], arguments);的意思就是把被包装的函数当作第一个参数传入包装函数,看一下示例:
function wrapped(){ alert('wrapped'); } //可以在wrapper之前调用原函数或者之后调用,是不是有点AOP的意思了 var wrapper=wrapped.wrap(function(oldFunc,param){ //oldFunc() alert(param); oldFunc(); });
//wrapper,wrapped wrapper("wrapper");
methodize方法: Takes a function and wraps it in another function that, at call time, pushes this to the original function as the first argument. 这个方法先检查将要被methodize的方法是否已经methodize过了,通过内部的变量this._methodized做检查, 最后methodize函数返回的其实就是this._methodized。 这句话:var a = update([this], arguments);是关键,可以看出把this当成第一个参数传到这个原始函数中了。看一下示例就明白了:
// start off with a simple function that does an operation // on the target object: var fn = function(target, foo) { target.value = foo; }; var object = {}; // 原始的方法 fn(object, 'bar'); object.value //-> 'bar' //调用methodize之后,可以看出fn函数第一个参数target变成了object object.fnMethodized = fn.methodize(); object.fnMethodized('boom!'); object.value //-> 'boom!'
Stellungnahme:
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn