1 <script type="text/javascript"> 2 var f={ 3 foo:function (argument) { 4 // body... 5 return this.x; 6 }, 7 x:"foo111" 8 }; 9 var f2={ 10 x:"foo222" 11 12 } 13 console.log(f.foo()); //输出foo111 14 console.log(f.foo.call(f2)); //输出foo222 15 //f2.foo(); 16 17 18 </script>
产生这样的输出结果,就是因为call函数改变了对象方法的运行环境
语句1:f.foo(); 此时foo内部的this指向的就是f
语句2:f.foo.call(f2) 将foo的执行环境由f换成f2,此时,foo内部的this指向就变成了f2
1 var x="window"; 2 var foo=function (argument) { 3 // body... 4 return this.x; 5 6 } 7 var f1={ 8 x:"f1" 9 10 } 11 12 var f2={ 13 x:"f2" 14 15 } 16 console.log(foo()); 17 console.log(foo.call(f1)); 18 console.log(foo.call(f2));
体现在应用中,有函数foo(),函数内部语句 return this.x
利用call/apply就可以更改foo函数的运行环境
foo()在全局环境,this指向window
foo.call(f1)在f1对象下,this指向f1
foo.call(f2)在f2对象下,this指向f2
这样foo在执行时就会返回不同的值
接下来再来看看在js继承中的call函数运用
1 function Father(name,age) { 2 // body... 3 this.name=name; 4 this.age=age; 5 6 } 7 8 Father.prototype={ 9 getName:function (argument) { 10 // body... 11 return this.name; 12 }, 13 14 } 15 16 function Son(name,age,job) { 17 // body... 18 // this.name=name; 19 // this.age=age; 20 // this.job=job; 21 Father.call(Son,name,age); 22 this.job=job; 23 } 24 Son.prototype=new Father(); 25 Son.getJob=function (argument) { 26 // body... 27 } 28
第21行,利用对象冒充在Son的环境下执行Father(name,age)
下篇文章再讨论继承
原文:http://www.cnblogs.com/windSamW/p/4914347.html