继承的定义
- ECMAScript 实现继承可以从父类入手,所有开发者定义的类都可作为父类,出于安全考虑,本地类和宿主类不能作为父类,因为容易收到恶意攻击
- 创建只是用于给子类提供通用函数的父类被看作抽象类
- 子类可以继承父类的所有属性和方法,子类可以扩展父类中没有的属性和方法,还可以覆盖父类中的属性和方法
继承的方式
一、对象冒充
原理:构造函数使用 this 关键字给所有属性和方法赋值(即采用类声明的构造函数方式)。因为构造函数只是一个函数,所以可使 ClassA 构造函数成为 ClassB 的方法,然后调用它。ClassB 就会收到 ClassA 的构造函数中定义的属性和方法
实现:
function ClassA(name){
this.name = name;
this.sayName = function(){
console.log(this.name);
}
}
function ClassB(name){
this.newName = ClassA; //函数名是指向函数的指针
this.newName(name);
}
var objA = new ClassA();
var objB = new ClassB('wyang');
objB.sayName(); //wyang
对象冒充可以实现多重继承
- 一个子类可以继承多个父类
- 两个类存在同名的属性或方法时,后继承的类优先级高
二、call() 方法
call([thisObj[,arg1[, arg2[, [,.argN]]]]])
参数:
- 第一个参数用作 this 的对象
- 参数都直接传递给函数自身
- 如果没有提供
thisObj
参数,那么Global
对象被用作thisObj
实现:
function fun(sex){
console.log(this.name + sex);
}
var obj = {
name:'wyang'
};
fun.call(obj,'is man'); //wyang
这个例子其实就是把
obj
替换成了fun函数中的this
,后面的参数与fun
函数的参数匹配
三、apply()方法
apply([thisObj[,argArray]])
参数:
- 第一个参数用作 this 的对象
- 传递给函数的参数的数组
- 如果没有提供
thisObj
参数,那么Global
对象被用作thisObj
实现:
function fun(sex,job){
console.log(this.name + sex + job);
}
var obj = {
name:'wyang'
};
fun.apply(obj,new Array('isman','fe')); //wyangismanfe
四、call()和apply()的区别
- 第一个参数一样
- 第二个参数:
call()
方法就是普通参数;apply()
方法是把参数组合成了数组进行传递(和函数的arguments相似)
五、call()和apply()的总结
call()
、apply()
方法其实就是修改对象内部的this
的指向