一,更改this指向
代码:
var name = 'window'; //默认规划到全局作用域 window 中,等于 window.name
var obj = {
name : 'obj'
};
function getName() {
return this.name;
}
console.log(getName()); //这里this指向全局
console.log(getName.apply(obj)); //这里指向 obj
console.log(getName.call(obj)); //这里指向 obj
直接调用函数对象getName,由于没有name属性,所以找全局作用域中的name,this指向了window对象;
将getName函数在obj对象上调用,函数体内的this也就指向了obj对象; (这里call的用法和apply一样)
控制台:
二:方法的继承
代码:
/**
* apply 可用于方法的继承
*/
function A(age) {
this.age = age; //这里this的指向会变成B()
}
function B(name, age) {
A.apply(this, [age]);
this.name = name;
/**
* call不需要用数组
*
* A.call(this, age);
* this.name = name;
*
*/
}
console.log(new B('张三',5000));
这里B方法继承了A方法中的 this.age = age ;
这个地方可以用每个函数体内都会有的 Arguments对象的实例arguments优化下:
/**
* apply 可用于方法的继承
*/
function A(name,age) {
this.age = age; //这里this的指向会变成B()
}
function B(name, age) {
A.apply(this,arguments);
this.name = name;
}
console.log(new B('张三',5000));
控制台:
三,多重继承
代码:
/**
* 多重继承
*/
function ClassA() {
this.add = function (a, b) {
return a + b;
}
}
function ClassB() {
this.sub = function (a,b) {
return a - b;
}
}
function ClassC() {
ClassA.apply(this);
ClassB.apply(this);
/**
* 用call也一样
*
* ClassA.call(this);
* ClassB.call(this);
*
*/
}
var classC = new ClassC();
console.log(classC.add(3,1));
console.log(classC.sub(3,1));
ClassC 继承了ClassA的add方法,ClassB 的sub方法;
控制台:
大家可以留言探讨。谢谢;