概念:
1.call 方法可以用来代替另一个对象调用一个方法,改变函数内部的this指向。
2.call 方法可将一个函数的对象上下文从初始的上下文改变为由 thisObj 指定的新对象。简单讲就是借用上下文环境
3.apply()和call()异曲同工,
使用:
1.第一个参数是一个对象,第二个参数是数组里面所有的参数
2.apply()第一个参数也是一个对象,第二个参数是一个数组
实例a:
1 var number = [-15,-1,0,17,59,108]; 2 var maxInNumber = Math.max.call(Math,-15,-1,0,17,59,108); 3 var maxInNumber = Math.max.apply(Math,number); 4 var maxNumber = Math.max(-1,12,59); 5 console.log(maxNumber); //59 6 console.log(maxInNumber); //108
这个例子的maxInNumber的this指向的方法变成了Math.max()这个方法本身,所以第六行输出了108
实例b:
1 function add(a,b){ 2 this(a,b); 3 console.log(a+b); //2 4 }; 5 function sub(a,b){ 6 console.log(a-b); //4 7 }; 8 add.call(sub,3,1);
这个实例 首先 add.call(sub,3,1)执行的是 add方法, 然后,add执行的时候, this已经变成了 sub这个方法本身,所有this(a,b)这一句输出了2
实例c:
1 function Movie(){ 2 this.name = "Movie"; 3 this.showName = function(){ 4 console.log(this.name); 5 } 6 } 7 function Book(){ 8 this.name = "Book"; 9 } 10 var movie = new Movie(); 11 var book = new Book(); 12 13 /**通过call()或者apply()方法,将原本属于Movie对象的showName()方法交给对象book使用**/ 14 movie.showName.call(book,""); // Book 第二个参数所有的参数 15 movie.showName.apply(book,[]); // Book 第二个参数是一个数组
这个实例通过call()或者apply()方法,将原本属于Movie对象的showName()方法交给对象book使用
实例d:
1 function Movie(name){ 2 this.name = name; 3 this.showName = function(){ 4 console.log(this.name); 5 } 6 } 7 function Book(name){ 8 Movie.apply(this,[name]); 9 // Movie.call(this,name); 10 } 11 var book = new Book("Javascript"); //book对象可以调用Movie对象上的方法和属性 12 book.showName(); //Javascript
关于继承:使用Movie对象代替this对象,那么Book对象也就有了Movie的属性和方法