关于call与apply函数的理解

 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(this,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)

 

下篇文章再讨论继承

posted @ 2015-10-27 15:20  Evans.wang  阅读(178)  评论(0)    收藏  举报