每日精进-重读狼叔的nodejs(卷一)二

167 阅读2分钟

复习下前端基础:

 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对象。