Javascript寄生组合继承
来源:互联网 发布:淘宝ie8版本过低 编辑:程序博客网 时间:2024/04/29 17:58
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>
通过将父类的原型赋值给一个新构造函数的原型,再将新构造函数的实例赋值给子类的原型,这样只需执行一次超类的构造函数即可以了。
- Javascript寄生组合继承
- JavaScript寄生组合继承
- 寄生组合继承
- 寄生组合继承例子
- javascript 寄生组合式继承
- JavaScript继承,寄生式继承
- JavaScript继承,寄生组合式继承
- JavaScript 继承---寄生式继承
- JavaScript 继承---寄生组合式继承
- javascript中寄生组合式继承
- JavaScript的寄生组合式继承
- 简单js类拷贝,寄生组合继承
- 面向对象之寄生组合继承
- JavaScript的继承--寄生组合式继承
- JavaScript中的寄生组合式继承方式
- JavaScript中寄生组合式继承的理解
- 【代码整理】JavaScript的寄生组合式继承
- JavaScript对寄生组合式继承的理解
- EXT4文件系统代码阅读的一点思考
- Office 2010安装1402错误
- C++基类与派生类的转换与多态性
- Ext store reload load 传参问题
- Oracle表空间的查询与创建
- Javascript寄生组合继承
- BZOJ3275【最小割】
- Intent 传递 List 利用Serializable
- leetcode24:Swap Nodes in Pairs
- Get started with Android fragments
- tomcat架构分析(connector BIO 实现)
- git - Git中从远程的分支获取最新的版本到本地方式
- 大素数判断和素因子分解(miller-rabin,Pollard_rho算法)
- 源代码安全加密系统对软件开发企业的重要性