浅析prototype框架中的this.initialize.apply(this, arguments)

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的混乱所带来的额外顾虑。

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值