prototype在很多模块上加了很好用的方法,本次仅针对Function中一些地方共同品味一下
回味一下bind方法
当初刚接触prototype时最疑惑的地方是Function中 bind方法
对于初学者,我教你这样理解
新方法
mootools的还可以绑定一个 闭包(对象),而他仅是普通function的延时执行,如果那个function里面如果含有 this的话,将得不到引用
先理解、消化了再说
还有 curry,wrap方法以后再续
不支持偶的观点望批评指正
回味一下bind方法
当初刚接触prototype时最疑惑的地方是Function中 bind方法
CODE:
Function.prototype.bind = function() {
var __method = this;//获得当前方法的引用 (run.bind(this); 就是run)
var args = $A(arguments);
//获得传递给bind方法的参数 并转化为数组
//应用run.bind(this,1,2,3) args就是[(this对象的引用),1,2,3]
var object = args.shift();
//就是把(this对象的引用)提取出来
return function() {
return __method.apply(object, args.concat($A(arguments)));
//这里的arguments又是另外一个了
//比如 var kk = run.bind(this,1,2,3);
// kk(4,5);这里的arguments就是[4,5]
}
}
但这个方法实在很实用
对于初学者,我教你这样理解
CODE:
function run(){
if(this.timer){
alert('获得了this对象');
return;
}
this.timer = setTimeout(run.bind(this),1000);
//问题: run你不加bind(this)的话会怎么样
//1秒后由setTimeout调用的这个函数,如果不bind(this)的话 函数中this这个对像会丢失
// 也就永远不会alert('获得了this对象'); 而且进入每隔1秒重复调用run()死循环
// run.bind(this)() = run.apply(this)
}
mootools中也有 不过mootools有点变态(仅
个人观点,不代表phpchina观点),多加了个
create方法,有点画蛇添足之嫌,代码就不贴了
新方法
- 延时执行
CODE:
Function.prototype.delay=function() {
var __method = this, args = $A(arguments), timeout = args.shift() * 1000;
return window.setTimeout(function() {
return __method.apply(__method, args);
}, timeout);
}
上面bind的介绍看懂了的话,这个就很轻松能看懂,不知道他是不是抄袭mootools的 mootools中可是先有这个方法的
mootools的还可以绑定一个 闭包(对象),而他仅是普通function的延时执行,如果那个function里面如果含有 this的话,将得不到引用
CODE:
var obj = function(){
this.kk = '你得到我了';
(function(){
alert(this.kk)// prototype 中会空值
}).delay(1,1,2,3);//延时一秒执行,传递参数1,2,3
}
new obj();
- methodize方法
CODE:
Function.prototype.methodize=function() {
if (this._methodized) return this._methodized;
var __method = this;
return this._methodized = function() {
return __method.apply(null, [this].concat($A(arguments)));
};
}
代码意思是把对象作为参数合并到其参数中,不知道在哪有用途
先理解、消化了再说
CODE:
var obj = function(){
var kk = (function(){
alert(arguments[0]);// IE中打印object
alert(arguments[1]);// 这才打印第一个参数
}).methodize();//methodize方法不接受参数
kk('第一个参数',2,3);
}
new obj();
- argumentNames方法
CODE:
Function.prototype.argumentNames=function() {
var names = this.toString().match(/^[/s/(]*function[^(]*/((.*?)/)/)[1].split(",").invoke("strip");
return names.length == 1 && !names[0] ? [] : names;
};
主要是用toString方法获得函数代码,利用正则或得参数列表
还有 curry,wrap方法以后再续
不支持偶的观点望批评指正