继承是面向对象中一个比较核心的概念,其他正统面向对象语言都会用两种方式实现继承,一个是接口实现,一个是继承。而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);