javascript框架prototype里利用apply来创建一个定义对象的模式:
var Class = {
create: function() {
return function() {
this.initialize.apply(this, arguments);
}
}
};
应用Class
var O = Class.create();
O.prototype={
initialize:function(content){
this.content=content;
}
say:function(){
console.log(this.content);
}
}
var o = new O("hello");
o.say();
解析:
var O = Class.create();
构造个一个function复制给O,这个function是
function() {
this.initialize.apply(this,arguments);
}
这个function方法是用来做构造函数的。使用function构造对象时,会让构造出来的对象的initialize方法执行apply()方法
function中的第一个this是指用new调用构造函数之后生成的对象,第二个this也是指同一个对象。那么this调用initialize方法,参数是arguments对象(参数的数组对象),在构造函数执行时,对象o就会去执行initialize方法来初始化
arguments作为create返回的构造函数的实参数组,传递给方法apply,在调用initialize时作为参数传递给初始化函数initialize。
另:javascript框架prototype的事件绑定
Function.prototype.bind = function() {
var __method = this;
var args = $A(arguments);
var object = args.shift();
return function() {
// 调用函数的apply方法执行函数, 其中的object为目标对象, args为bind方法中的参数列表(除了第一个参数以外的参数构成的数组)
//事实上, 这里的$A(arguments)一定是一个空数组
return __method.apply(object, args.concat($A(arguments)));
}
}
解析:
该bind用途在于将某个函数绑定到特定的函数去执行。
a) var __method = this;首先把Function Context重新赋值到一个本地变量,使得在Closure(javascript的特性,解释为"闭包")中都能访问到,这样下边就可方便获取了。实质上就是bind方法的调用者, 是一个函数对象。
b) var args = $A(arguments);这里因为arguments本来就是一个数组的对象,通过$A(arguments)将传入到bind方法的参数都转化为array.
c) var object = args.shift();通过截取args的第一个参数获取Target Object(目标对象),此时args为除了第一个参数以外的参数构成的数组(array)
d) 返回新函数对象(不带有任何的参数的函数),通过apply把__method(bind方法的调用者)绑定到Target Object(目标对象),并传递了除Target Object(目标对象)之外的所有参数构成的数组args.concat($A(arguments)),最终Target Object(目标对象)就可执行__method。
如此费劲周折绑定某一个函数所换来的优势是,不需要顾及Function Context的混乱所带来的额外顾虑。
var Class = {
};
应用Class
var O = Class.create();
O.prototype={
}
var o = new O("hello");
o.say();
解析:
var O = Class.create();
构造个一个function复制给O,这个function是
function() {
}
这个function方法是用来做构造函数的。使用function构造对象时,会让构造出来的对象的initialize方法执行apply()方法
function中的第一个this是指用new调用构造函数之后生成的对象,第二个this也是指同一个对象。那么this调用initialize方法,参数是arguments对象(参数的数组对象),在构造函数执行时,对象o就会去执行initialize方法来初始化
arguments作为create返回的构造函数的实参数组,传递给方法apply,在调用initialize时作为参数传递给初始化函数initialize。
另:javascript框架prototype的事件绑定
Function.prototype.bind = function() {
}
解析:
该bind用途在于将某个函数绑定到特定的函数去执行。
a) var __method = this;首先把Function Context重新赋值到一个本地变量,使得在Closure(javascript的特性,解释为"闭包")中都能访问到,这样下边就可方便获取了。实质上就是bind方法的调用者, 是一个函数对象。
b) var args = $A(arguments);这里因为arguments本来就是一个数组的对象,通过$A(arguments)将传入到bind方法的参数都转化为array.
c) var object = args.shift();通过截取args的第一个参数获取Target Object(目标对象),此时args为除了第一个参数以外的参数构成的数组(array)
d) 返回新函数对象(不带有任何的参数的函数),通过apply把__method(bind方法的调用者)绑定到Target Object(目标对象),并传递了除Target Object(目标对象)之外的所有参数构成的数组args.concat($A(arguments)),最终Target Object(目标对象)就可执行__method。
如此费劲周折绑定某一个函数所换来的优势是,不需要顾及Function Context的混乱所带来的额外顾虑。