继承

来源:互联网 发布:oracle和mysql的优缺点 编辑:程序博客网 时间:2024/05/29 15:22
//----继承:通过原型链实现----------
function Box(){//被继承的函数叫做超类型(其他语言中的父类,派生类)
this.name="lee";
}
function Desk(){//集成的函数叫做子类型(其他语言中叫做子类,派生类)
this.age=100;
}

//通过原型链继承,超类型实例化后的对象实例,赋值给子类的原型属性
Desk.prototype=new Box();
var desk=new Desk();
alert(desk.name);
继承也有之前问题,比如字面量重写原型会中断关系,使
用引用类型的原型,并且子类型还无法给超类型传递参数。
为了解决引用共享和超类型无法传参的问题,我们采用一种叫借用构造函数的技术,或
者成为对象冒充(伪造对象、经典继承)的技术来解决这两种问题。


//----使用对象冒充继承:只能继承构造里的信息,不能继承原型中的
function Box(name,age){
this.name=name;
this.age=age;
this.family=["1","2","3"]
}
Box.prototype.family="4";
function Desk(name,age){
Box.call(this,name,age);//对象冒充
}
var desk=new Desk('gt',100);
alert(desk.name);
alert(desk.family);//1,2,3

构造函数里的方法,放在构造函数里,每次实例化都会分配一个新的地址,浪费,
所以最好放在原型中,保证多次实例化只有一个地址。

var Box=function(name,age){
this.name=name;
this.age=age;
}

Box.prototype.run=function(){
return this.age+this.name+'loading';
}

var Desk=function(name,age){
Box.call(this,name,age);
}

var desk=new Desk('gt',100);
alert(desk.name);
虽然这样写是正确的,但却访问不到原型中的方法


// 借用构造函数虽然解决了刚才两种问题,但没有原型,复用则无从谈起。
// 所以,我们需要原型链+借用构造函数的模式,这种模式成为组合继承
//---组合继承:可继承构造函数中的,也可继承原型中的------
var Box=function(name,age){
this.name=name;
this.age=age;
}

Box.prototype.run=function(){   //共享的方法
return this.age+this.name+'loading';
}

var Desk=function(name,age){
Box.call(this,name,age);  //对象冒充:集成构造函数中的
}

Desk.prototype=new Box();//原型链继承:继承原型中的

var desk=new Desk('gt',100);
alert(desk.run());