Prototype Function对象 学习(2)


var obj = {
name: 'A nice demo',
fx: function() {
alert(this.name + '\n' + $A(arguments).joi(', '));
}
};
//这里的[1,2,3]就是slice.call(arguments, 1);里面的arguments
var fx2 = obj.fx.bind(obj, 1, 2, 3);
//这里的[4,5]就是merge(args, arguments);里面的arguments
fx2(4, 5);
// Alerts the proper name, then "1, 2, 3, 4, 5"


bindAsEventListener方法:
这个方法和bind差不多,最主要差别在这句:var a = update([event || window.event], args);总是保证绑定的函数第一个参数为event对象。看一下示例:

复制代码 代码如下:


var obj = { name: 'A nice demo' };
function handler(e) {
var data = $A(arguments);
data.shift();
alert(this.name + '\nOther args: ' + data.join(', ')); }
handler.bindAsEventListener(obj, 1, 2, 3);
//=======================
<input type="button" value="button" />


curry方法:
这个方法的个人觉得帮助文档上给的例子不好,下面给出另一个示例,一看就明白了:

复制代码 代码如下:


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


delay和defer方法:
基本就是window.setTimeout的简单封装,时间单位为秒,看一下示例:

复制代码 代码如下:


// 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!'

您可能感兴趣的文章:

内容版权声明:除非注明,否则皆为本站原创文章。

转载注明出处:https://www.heiqu.com/wjwwxg.html