构造函数,原型和实例的关系:
每个构造函数都有一个原型对象,原型对象都包含一个指向构造函数的指针,而实例都包含一个指向原型对象的内部指针。
1.原型链:
记住:所有函数的默认原型都是Object的实例,因此默认原型都会包含一个内部指针,指向Object.prototype
原型链问题:
1).引用类型值的原型属性会被所有实例共享
2)..在创建子类型的实例时,不能向超类型的构造函数中传递参数
2.借用构造函数:(伪造对象火经典继承)
3.组合继承(伪经典继承),最常用的继承模式
思路:使用原型链实现对原型属性和方法的继承,而通过借用构造函数来实现对实例属性的继承。
这样,既通过在原型上定义方法实现 了函数复用,又能保证每个实例都有它自己的属性。
function SuperType(name){
this.name = name;
this.colors = ["red","blue","green" ];
}
SuperType.prototype.sayName = function(){
alert(this.name);
}
function SubType(name, age){
//继承属性
SuperType.call(this,name);
this.age =age;
}
//!继承方法
SubType.prototype = new SuperType();
SubType.prototype.sayAge = function(){
alert(this.age);
}
var instance1 = new SubType("Nicholas",29);
instance1.colors.push("black");
alert(instance1.colors);//"red,blue,green,black"
instance1.sayName();
instance1.sayAge();
var instance2 = new SubType("Greg",27);
alert(instance2.colors);//"red,blue,green"
instance2.sayName();
instance2.sayAge();
4.原型式继承
5.寄生式继承
6.寄生组合式继承