面向对象---继承

继承是面向对象中一个比较核心的概念,其他正统面向对象语言都会用两种方式实现继承,一个是接口实现,一个是继承。而ECMAscript只支持继承,不支持接口实现,而实现继承的方式依靠原型链来完成。

 function Box(){ //被继承的函数叫超类型(父类,基类)    this.name="中国";

};

function Fun(){                               //继承的函数叫做子类型(子类,派生类)
    this.user=333;
};
//通过原型链继承,超类型实例化后的对象实例,赋值给子类型的原型属性。
//new Box()会将Box构造里的信息和原型里的信息都交给fun
//Fun的原型,得到的是Box的构造+原型里的信息
Fun.prototype=new Box(); var fun=new Fun(); alert(fun.name); alert(fun.user); function Gou(){ this.uu=88; } Gou.prototype=new Fun(); var b=new Gou(); alert(b.name); //输出中国继承了Box也继承了Fun

//对象冒充继承可以传参  但不能继承原型的属性
function Box(age){
    this.user=age;
    this.family=['父亲','姐妹','弟弟'];
};

Box.prototype.name=33;

function Fun(age){
    Box.call(this,age);                                //对象冒充给超类型传参
};

var b=new Fun(33);
alert(b.user);
alert(b.family);
alert(b.name);                                    //此方式不能继承原型  输出undefinde
//原型链+对象冒充的方法  实现既能继承属性也能继承原型   组合继承
//
//
function Box(age){
    this.user=age;
    this.family=['父亲','姐妹','弟弟'];
};

Box.prototype.name='中国';

Fun.prototype=new Box();            //原型链继承方式
function Fun(age){
    Box.call(this,age);                                
};

var b=new Fun(33);
alert(b.user);
alert(b.family);
alert(b.name);                                    

还有一种继承模式叫做:原型式继承:这种继承借助原型并基于已有的对象创建新对象,同时还不比因此创建自定义类型。

 

//原型式继承
//临时中转函数
function obj(o){                    //o表示将要传递进入一个对象        
    function F(){};                    //F构造是一个临时新建的对象,用来存储传递过来的对象
    F.prototype=o;                //将o对象实例赋值给F构造的与原型对象
    return new F();                //最后返回这个得到传递过来对象的对象实例
}
//其实就相当于 F.prototypre=o  等于box1.prototypr=new Box();

//这是字面量的声明方式  相当于var box=new box();
var box={
    name:"lee",
    age:100
};
//box1等于new F();
var box1=obj(box);
alert(box1.name);

 

 

 

posted @ 2019-01-16 10:41  WhiteSpace  阅读(152)  评论(0编辑  收藏  举报