1、原型链实现继承存在的问题:(因为这些问题的存在,实践中很少会单独使用原型链)
(1)、由于共享的特性,而造成修改一个父级的一个引用类型属性值时,会影响到其他实例
(2)、没办法在不影响所有对象实例的情况下,给超(父)类型的构造函数传递参数
2、借用构造函数(伪造对象、经典继承)
优点:
解决原型中包含引用类型值所带来的连带修改的问题
可以在子类型构造器中项超类型构造函数场地参数
概念:在子类构造函数的内部调用超(父)类型构造函数(使用call()或apply()改变作用域)
缺点:存在构造函数模式存在的问题,方法都在构造函数中定义,没法复用了(所以很少单独使用)
eg:
function A(){
this.colors = ["red","blue","green"];
}
function B(){
A.call(this);//继承了A
}
var b1 = new B();
b1.colors.push("black");
alert(b1.colors);//"red,blue,green,black"
var b2 = new B();
alert(b2.colors);//"red,blue,green"没有被b1的修改而影响到
3、组合继承(伪经典继承)
1、概念:使用原型链实现对原型属性和方法的继承,而通过借用构造函数来实现对实例属性的继承
//定义A类构造函数
function A(name){
this.name = name;
this.colors = ["red","blue","green"];
}
A.prototype.sayName = function(){
alert(this.name);
}
//定义B类构造函数
function B(name,age){
A.call(this,name);//继承A的属性
this.age = age;
}
B.prototype = new A();//继承A的方法
B.prototype.constructor = B;
B.prototype.satAge = function(){
alert(this.age);
}
var b1 = new B("tom",22);
b1.colors.push("black");
alert(b1.colors);// ["red","blue","green","black"];
b1.sayName();//"tom"
b1.sayAge();//22
var b2 = new B("sam",21);
alert(b1.colors);// ["red","blue","green"];
b1.sayName();//"sam"
b1.sayAge();//21