继承 :
接口继承:继承方法签名
实现继承:继承实际方法
js中函数没有签名,所以使用的是实现继承-------依靠原型链实现
==================================================================js继承:
让一个引用类型 继承 另一个引用类型的属性和方法
==================================================================
原型链:
//构造Afunction A(){
this.name="loo";
}
A.prototype.aSay=function(){
alert(this.name);
}
//构造B
function B() {
this.age=23;
}
//将B作为A的实例,继承A的原型;
B.prototype=new A();
//给A的实例B添加自己的方法
B.prototype.bSay = function() {
alert(this.age);
};
//实例化B;
var instance=new B();
alert(instance.age); //23
alert(instance.name); //loo
instance.bSay(); //23
instance.aSay(); //loo*/
/*原型链: B的实例instance的[[prototype]]属性——————指向A的实例B,
* A的实例B的[[prototype]]属性——————指向Object的实例A,
* Object的实例A的[[prototype]]属性————指向Object。
*实例instance的属性和方法的查找沿着原型链向上查找。
*原型链存在的问题:
*1.不能传递参数;
*2.使用原型链实现继承时,不能使用对象字面量创建原型方法,因为这样会重写原型链。切记切记切记。
*3.构造函数A中的引用类型值的实例属性被继承后变成了B的原型属性
* 这样会导致B的实例中的引用类型值的属性被共享。比如:
function A() {
this.choose=["1","2","3"];
}
function B() {
}
B.prototype=new A();
var instance1=new B();
var instance2=new B();
alert(instance1.choose); //1,2,3
alert(instance2.choose); //1,2,3
instance1.choose.push(4);
alert(instance1.choose);//1,2,3,4
alert(instance2.choose);//1,2,3,4
instance1实例对引用类型值的操作影响了原型B继而影响到了instance2。
*/
=================================================
借用构造函数
借用构造函数可以解决原型链中引用类型值的问题,并且可以为原型传入参数;缺点是方法定义在构造函数上了。
function A(name) {
this.choose=["1","2","3"];
this.name=name;
}
function B(name) {
//内部调用,既继承A有可传递参数;
A.call(this,name);
//继承后添加B的属性,即构造函数的实例属性
this.age=23;
}
//实例化
var instance1=new B("loo");
var instance2=new B("ho");
alert(instance1.choose);//1,2,3
alert(instance2.choose);//1,2,3
instance1.choose.push("4");
alert(instance1.choose); //1,2,3,4
alert(instance2.choose); //1,2,3 instance2未被影响
alert(instance1.name); //loo
alert(instance2.name); //ho
alert(instance1.age); //23
====================================
组合继承:组合原型链与借用构造函数
思路:利用原型链来继承原型属性和方法,利用借构函数实现实例属性的继承例:
//组合继承(常用继承模式)
function A(name) {
this.name=name;
this.choose=["1","2","3"];
}
A
A.prototype.sayName=function () {
alert(this.name);
}
//继承
function B(name,age) {
//继承属性
A.call(this,name);
//定义实例属性
this.age=age;
}
//继承方法
B.prototype=new A();
//定义B的方法
B.prototype.sayAge=function () {
alert(this.age);
}
//实例化
var instance1=new B("loo",24);
var instance2=new B("ho",23);
alert(instance1.choose);//1,2,3
alert(instance2.choose);//1,2,3
//改版instance1中的数组
instance1.choose.push("4");
alert(instance1.choose);//1,2,3,4
alert(instance2.choose);//1,2,3 instance2数组未被影响
//调用方法
instance1.sayName();//loo
instance2.sayName();//ho
//查看两个实例调用的方法是否相等
alert(instance1.sayName==instance2.sayName); //true
即组合继承可以传递参数,可以继承实例属性,原型属性,方法;
所有实例可以共享方法。