您的位置:首页 > Web前端 > JavaScript

Javascript寄生组合继承

2015-04-09 13:59 363 查看
Javascript目前通用的Javascript的继承是将原形链和借用构造函数组合在一起的组合继承,但是组合继承有一个缺点就是需要父类构造函数需要执行2次。示例代码如下:

<script>

function Person(name,birthday){
this.name=name;
this.birthday=birthday;

if(typeof this.sayName !="function"){
Person.prototype.sayName=function(){alert(this.name);}
}

if(typeof this.sayBirthday !="function"){
Person.prototype.sayBirthday=function(){alert(this.birthday);}
}
}

function Employee(name,birthday,job){
//第二次执行构造函数
Person.call(this,name,birthday);
this.job=job;

if(typeof this.sayJob !="function"){
Employee.prototype.sayJob=function(){alert(this.job);}
}
}
//第一次执行构造函数
Employee.prototype=new Person();

var emp1=new Employee("Mike","1980-01-01","Project Manager");
emp1.sayName();
emp1.sayBirthday();
emp1.sayJob();
</script>

并且Employee.prototype中存在了共享的属性name和birthday,只不过在第二次执行构造函数时被子类所覆盖。而寄生组合继承则解决了这方面的问题。示例代码如下:

<script>
//定义namespace
Mike={};
Mike.Util={};
Mike.Class={};

Mike.Util.inherit=function(SuperType,SubType)
{
function F(){}
F.prototype=SuperType.prototype;
var o=new F();
o.constructor=SubType;
SubType.prototype=o;
};

function Person(name,birthday){
this.name=name;
this.birthday=birthday;

//使用寄生器组合继承方式,不能使用动态定义原型
//if(typeof this.sayName !="function"){
// Person.prototype.sayName=function(){alert(this.name);}
//}

//if(typeof this.sayBirthday !="function"){
// Person.prototype.sayBirthday=function(){alert(this.birthday);}
//}
}

Person.prototype.sayName=function(){alert(this.name);}
Person.prototype.sayBirthday=function(){alert(this.birthday);}

function Employee(name,birthday,job){
Person.call(this,name,birthday);
this.job=job;

//使用寄生器组合继承方式,不能使用动态定义原型
//if(typeof this.sayJob !="function"){
// Employee.prototype.sayJob=function(){alert(this.job);}
//}
}

//注意继承必须放在子类添加原型方法之前
Mike.Util.inherit(Person,Employee);
Employee.prototype.sayJob=function(){alert(this.job);}

var emp1=new Employee("Mike","1980-01-01","Project Manager");
var emp2=new Employee("Felice","1980-01-01","Supervisor");

emp1.sayName();
emp1.sayBirthday();
emp1.sayJob();

emp2.sayName();
emp2.sayBirthday();
emp2.sayJob();
</script>

通过将父类的原型赋值给一个新构造函数的原型,再将新构造函数的实例赋值给子类的原型,这样只需执行一次超类的构造函数即可以了。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: