继承
1)原型链继承
每个构造函数都有一个原型对象,原型对象中都包含一个指向构造函数的指针,而实例都包含一个指向原型对象的内部指针。
当原型对象等于另外一个类型的实例即继承。
//定义父构造函数类型
function Animal(){
this.name = "animal"
}
Animal.prototype = {
sayName:function(){
console.log(this.name);
}
}
//定义子类类型
function Dog(){
this.color = "灰色"。
}
//通过将子对象的原型对象指向父对象的一个实例来完成继承
Dog.prototype = new Animal();
Dog.prototype.constructor = Dog;
//子对象的方法其实是定义在了父类对象的实例上。
Dog.prototype.sayColor = function(){
console.log(this.color);
}
var dog = new Dog();
console.log(dog);
dog.sayColor();
dog.sayName();
2)经典继承
也称 "伪造对象" 或 ”借用构造函数",在子类型构造函数的内部调用超类型构造函数。函数不过是在特定环境中执行代码的对象,因此通过apply(),call()方法可以在(将来)新建对象上执行构造函数,即在子类型对象上执行父类型函数中定义的所有对象初始化的代码。结果每个子类实例中都具有了父类型中的属性以及方法
function Animal(name){
this.name = name;
this.colors = ["red","gray"];
}
function Dog(name){
//继承了Animal
Animal.call(this,name);
this.color = "gray";
}
Animal.prototype.sayName = function(){
alert(this.name);
}
3)组合继承(原型链继承+经典继承)
也称“伪经典继承”,将原型链和借用构造函数的技术组合在一起。原理是:使用原型链实现对原型属性和方法的继承,而通过借用构造函数实现对实例属性的继承。
function Animal(name){
this.name = name;
this.colors = ["red","gray"];
}
function Dog(name){
//经典继承,继承了Animal(属性)
Animal.call(this,name);
this.color = "gray";
}
Animal.prototype.sayName = function(){
/alert(this.name);
}
//原型链继承,继承了方法
Dog.prototype = new Animal();
Dog.prototype.constructor = Animal;