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>
通过将父类的原型赋值给一个新构造函数的原型,再将新构造函数的实例赋值给子类的原型,这样只需执行一次超类的构造函数即可以了。
<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>
通过将父类的原型赋值给一个新构造函数的原型,再将新构造函数的实例赋值给子类的原型,这样只需执行一次超类的构造函数即可以了。
相关文章推荐
- JS学习笔记——JavaScript继承的6种方法(原型链、借用构造函数、组合、原型式、寄生式、寄生组合式)
- JavaScript面向对象——深入理解寄生组合继承
- Javascript 组合继承 原型链继承 寄生继承
- JavaScript寄生组合继承
- Javascript继承(暂略去中转函数、组合继承和寄生继承)
- JavaScript中继承(三) -- 组合继承
- JavaScript寄生组合式继承分析
- javascript中的继承-寄生组合式继承
- JavaScript高级程序设计之寄生组合式继承
- 面向对象的程序设计(十)寄生组合式继承与组合继承比较
- JavaScript中的继承之组合继承
- JavaScript之组合继承(伪经典继承)
- javascript_伪造和组合实现的继承
- 寄生组合继承
- 寄生组合继承例子
- 寄生组合式继承——《Javascript 高级程序设计》6.3.6
- javascript中的继承-组合继承
- javascript 寄生组合式继承
- JavaScript继承基础讲解(原型链、借用构造函数、混合模式、原型式继承、寄生式继承、寄生组合式继承)