Javascript详解之对象冒充-apply和call

作者:邹阳 | 发表于:2016-04-17 15:06:50

阅读量:(290) | 所属栏目:编程

函数还有两个属性:length、prototype
prototype有2个方法,用于对象冒充:apply() 和 call()        

box.call(abc)  box的作用域在abc里,box就冒充了abc。box可能是个函数,box里的this就会指向abc。但它只能继承构造里的实例属性,不能继承原型里的

call()方法作用跟apply()方法相同,区别仅仅在于接收参数的方式不同,实际中传递的参数不常使用,不用参数就直接省略它。
call()的参数是一个一个传递进去的:例如:box.call(abc, 参数一,参数二,参数三……)    
而apply()是传递一个数组作为参数:例如:box.apply(abc, [参数一,参数二,参数三……] ) 

上面2个举例都是给box传入参数,同时box的作用域冒充到abc,box里面的this就会指向abc了,最后执行box。

说明:apply()传递不定参:box.apply(abc, arguments )     可以将调用box.apply(abc, arguments ) 的那个函数的参数全部传入。
示例:
var color = '红色的';        //这个color的作用域在window里
var box = { color:'蓝色的' };   //这个color的作用域在box里
function sayColor(){ alert( this.color );  }     //此时sayColor的作用域在window里,this指向的window,直接执行会返回‘红色的’

sayColor();  // 返回 红色的
sayColor.call(window);   // 返回 红色的
sayColor.call(this);        // 返回 红色的

sayColor.call(box);        //返回 蓝色的。解释如下
// 返回 蓝色的  sayColor的作用域在box下了,
//所以sayColor函数内的this指向的box。
//所以this.color就是box.color,不是以前的window.color
补充:如果call、apply括号里不传入参数,那么就会默认传入了window
回复内容:(还能输入1000字)
验 证 码: