类式继承
学习了几种继承的模式,但是还是对于其实际运用还不是很了解,如有对其比较了解的,希望能够指导指导。
默认继承
function Parent(name){ this.name=name||'ad'; } Parent.prototype.say=function(){ return this.name; } function Child(name){} inherit(Child,Parent); function inherit(C,P){ C.prototype=new P();//原型属性应该指向一个对象,而不是一个函数因此它必须指向一个由父构造函数所创建的实例(一个对象) }
当使用一个new Child()语句创建一个对象时,它会通过原型从Parent()实例中获取它的对象。
var kid=new Child();
kid.say(); //ad
在子对象上添加属性后
var kid=new Child();
kid.name='other';
kid.say(); //other
特点或者说是缺点:同时继承 了添加到this的属性和原型上的属性,不支持将参数传递到父构造函数(new Child('anthoer').say();//ad)
借用构造函数
function Parent(){ this.name=['html']; } var oParent=new Parent(); function Blog(){} Blog.prototype=oParent; var child=new Blog(); function Page(){ Parent.call(this); } var otherChild=new Page(); oParent.hasOwnProperty('name'); //true child.hasOwnProperty('name'); //false otherChild.hasOwnProperty('name'); //true //child对象通过原型获得name属性,并没有将oParent作为自身的属性,所以返回false。 //otherChild对象本身具有一个name属性,因为在借用构造函数的时候,新对象会获得父对象中的tags成员的副本(不是引用) blog.name.push('css'); otherChild.name.push('php'); alert(oParent.name.join(','));//html,css 由于otherChild.name和oParent.name指向同一个数组。 function Parent(name){ //父构造函数 this.name=name||'ad'; } Parent.prototype.say=function(){ return this.name; } funcion Child(name){ //子构造函数 Parent.call(this,arguments); } var oChild=new Child('bd'); oChild.name;//bd typeof oChild.say;//undefined
优缺点:当使用借用构造函数时可以借用多个构造函数;无法获取原型的属性, 可以获得父对象自身的真实副本,则不会存在子对象意外覆盖父对象属性的风险
借用和设置原型
function Parent(name){ //父构造函数 this.name=name||'ad'; } Parent.prototype.say=function(){ return this.name; } funcion Child(name){ //子构造函数 Parent.call(this,arguments); } Child.prototype=new Parent(); var oChild=new Child('bd'); oChild.name; //bd oChild.say(); //bd delete oChild.name; oChild.name; //ad oChild.say(); //ad
优:可以获得父对象本身的成员副本以及指向父对象中可复用功能
缺:父构造函数被调用两次,自身属性会被继承两次
共享模型
function inherit(C,P){ C.prototype=P.Prototype; }
只能继承原型中的属性,所以需要把要继承的东西放在原型中
优:不涉及任何父构造函数的调用,简短而迅速的原型链查询
缺:在继承链下方的任何子对象或孙对象都能够修改原型,
临时构造函数
function inherit(C,P){ var F=function(){} F.prototype=P.prototype; C.prototype=new F(); }
断开了父对象与子对象的原型之间的直接链接关系,解决了共享模式的子对象修改父对象原型属性的问题,不过也只继承了原型的属性。