首页 > 语言 > JavaScript > 正文

Prototype Function对象 学习

2024-05-06 14:14:56
字体:
来源:转载
供稿:网友
这个对象就是对function的一些扩充,最重要的当属bind方法,prototype的帮助文档上特意说了一句话:Prototype takes issue with only one aspect of functions: binding.其中wrap方法也很重要,在类继承机制里面就是利用wrap方法来调用父类的同名方法。
argumentNames
bind
bindAsEventListener
curry
defer
delay
methodize
wrap
代码如下:
//通过Object对象的extend方法对Function的prototype进行扩展
Object.extend(Function.prototype, (function() {
var slice = Array.prototype.slice;
//把args添加到array后面,并返回array,内部方法
function update(array, args) {
var arrayLength = array.length, length = args.length;
while (length--) array[arrayLength + length] = args[length];
return array;
}
//基本和update方法一样,但是不改变传入参数array,返回一个新的array
function merge(array, args) {
array = slice.call(array, 0);
return update(array, args);
}
//把函数的参数格式化成数组,并返回
function argumentNames() {
var names = this.toString().match(/^[/s/(]*function[^(]*/(([^)]*)/)/)[1]
.replace(/////.*?[/r/n]|///*(?:.|[/r/n])*?/*///g, '')
.replace(//s+/g, '').split(',');

return names.length == 1 && !names[0] ? [] : names;
}
//把执行函数的上下文绑定到context
function bind(context) {
if (arguments.length < 2 && Object.isUndefined(arguments[0])) return this;
var __method = this, args = slice.call(arguments, 1);
return function() {
var a = merge(args, arguments);
return __method.apply(context, a);
}
}
//基本和bind差不多,就是保证传入的第一个参数一定是event对象
function bindAsEventListener(context) {
var __method = this, args = slice.call(arguments, 1);
return function(event) {
var a = update([event || window.event], args);
return __method.apply(context, a);
}
}
//curry是一个数学家的名字,这个方法的作用就是可以连续的传入参数,看下面的具体例子就知道了
function curry() {
if (!arguments.length) return this;
var __method = this, args = slice.call(arguments, 0);
return function() {
var a = merge(args, arguments);
return __method.apply(this, a);
}
}
//window.setTimeout函数的简单封装
function delay(timeout) {
var __method = this, args = slice.call(arguments, 1);
timeout = timeout * 1000
return window.setTimeout(function() {
return __method.apply(__method, args);
}, timeout);
}
//相当于delay(0.01)
function defer() {
var args = update([0.01], arguments);
return this.delay.apply(this, args);
}
//用wrapper包装将要调用的函数,实现了简单的AOP功能
function wrap(wrapper) {
var __method = this;
return function() {
var a = update([__method.bind(this)], arguments);
return wrapper.apply(this, a);
}
}
//把当前上下文作为第一个参数显示的传入调用的方法
发表评论 共有条评论
用户名: 密码:
验证码: 匿名发表

图片精选