复习下前端基础:
1. call和apply
call和apply都是为了改变某个函数运行时的context(上下文)而存在的,换
句话说,就是为了改变函数体内部this的指向而存在的。
它们的区别在于,第二个参数的形式不同,如下所示。
obj.call(thisobj, arg1, arg2, ...);
obj.apply(thisobj, [arg1,arg2, ...]);
apply的第二个参数为数组形式,函数会自动将数组展开;call的第二个参数为不定参数,需要传递几个就传递几个。
2. bind
bind方法创建了一个新函数,当函数被调用时,会将this关键词设置为提供
的值,调用新函数时,会在方法调用之前提供一个给定的参数序列。ES5开
始就引入了bind方法,它的用法和call的用法类似,即第二个参数是可变参
数,原型如下。
obj.bind(thisObj, arg1, arg2, ...);
把obj绑定到thisObj,这时thisObj便具备了obj的属性和方法。与call和ap
ply不同的是,bind绑定之后返回绑定完成的函数,不会立即执行,需要再
显式执行一次此函数才能完成调用。
使用上面的函数定义,调用如下。
var c = test.bind(obj, 3);
c();
3. Object.defineProperty
Object.defineProperty是ES5中新增的一个API,
其作用是给对象的属性增加更多的控制,目前Vue和Avalon中的双向数据绑
定均是通过它来实现的。
语法如下。
Object.defineProperty(obj, prop, descriptor);
其中参数说明如下:
obj: 需要定义属性的对象(目标对象)。
prop: 需要被定义或修改的属性名(对象上的属性或者方法)。
descriptor: 需要被定义或修改的属性的描述符。
4. delegate
在JavaScript里,可以将一个对象的方法、属性等委托给另一个对象。Koa
的上下文对象ctx可以访问一些request或response上的方法、属性,原因
在于,request或response上的方法、属性被委托给了ctx对象。