方法:都是改变函数体内部this的指向,可实现构造函数的继承
1.bind()
第一个参数:this指向
后面的参数:作为实参传给了新函数
bind()的执行结果:改变了this指向的新函数,没有自动执行,需要手动执行,(返回新的函数。两次bind返回两个新函数,函数 是对象,两个对象不相等)
2.call()
第一个参数:this指向
后面的参数:作为实参传给了新函数
call()的执行结果:自动执行改变了this指向的新函数
3.apply()
第一个参数:this指向
第二个参数:必须是数组,被自动解析之后,每个数据作为实参传给了新函数(覆盖了新函数的arguments)
apply()的执行结果:自动执行改变了this指向的新函数
例1:区别
var obj = {
name:"admin",
show:function(a,b){
console.log(this.name);
console.log(a,b)
}
}
var obj2 = {
name:"root"
}
obj.show("hello","world"); //admin //hello world
obj.show.bind(obj2,"html","css")(); //root //html css
obj.show.call(obj2,"js","php"); //root //js php
obj.show.apply(obj2,["python","mysql"]);//root //python mysql
例2:bind()改变this指向,实现继承
function parent1(n){
this.show1 = function(){
console.log(1);
}
}
function parent2(n){
this.show2 = function(){
console.log(2);
}
}
function parent3(n){
this.show3= function(){
console.log(3);
}
}
function child(n){
parent1.bind(this)();
parent2.bind(this)();
parent3.bind(this)();
}
var c = new child();
c.show1(); //1
c.show2(); //2
c.show3(); //3
例3:综合
function parent(n){
this.name = n;
this.show = function(){
console.log(this.name);
}
}
function child(n){
// parent.bind(this,n)();
// parent.call(this,n);
parent.apply(this,[n]); //三种方法都可实现继承
}
var p = new parent("父");
var c = new child("子");
p.show(); //父
c.show(); //子
改变this指向实现继承的优缺点
缺点:
只能继承构造函数中的内容,不能继承原型上的内容
优点:
1.简单方便
2.可以实现多继承:可以继承多个构造函数中的内容