继承-类式继承、原型继承、掺元继承
2012-02-17 21:22 边缘er 阅读(159) 评论(0) 编辑 收藏 举报类式继承
当前最常用的继承方式,是对真正基于类的继承的一种模仿(此文代码参考自js设计模式,此方法也就是js高级程序设计中的组合继承)。
function extend(subClass, superClass){//模仿类继承方法
var F = function(){};
F.prototype = superClass.prototype;
subClass.prototype = new F();
subClass.prototype.constructor = subClass;
subClass.super = superClass.prototype;//子类可以调用父类
if (superClass.prototype.constructor == Object.prototype.constructor){
superClass.prototype.constructor = superClass;
}
}
function Person(name){//父类
this.name = name;
}
Person.prototype.getName = function(){
return this.name;
}
function Author(name, books){//子类
Author.subClass.super.constructor.call(this, name);
this.books = books;
}
extend(Author, Person);
//继承后,Author已有getName方法,也可Author.subClass.super.getName调用父类方法
Author.prototype.getBooks = function(){//Author新方法
return this.books;
}
原型继承
js特有的继承模式,更能节省内存,因为不想类那继承那么好理解,所以用的较少。
function clone(o){
function F(){};
F.prototype = o;
return new F();
}
var FatherObject = {};//父对象
FatherObject.string1 = 'default value';
FatherObject.createChildObject = function(){
return {
bool : true,
num : 10
}
}
FatherObject.childObject = FatherObject.createChildObject();//父对象的子对象
var sonObject = clone(FatherObject);//继承
sonObject.createChildObject();
sonObject.childObject.num = 5;
掺元继承
并不是严格的继承,是一种扩充,把一个共用方法扩充到很多个类中。间接的实现了子类继承多个父类。
function augment(receivingClass, givingClass){
if (arguments[2]){//如果存在第3个参数(继承指定方法,并非全部)
for (var i = 2, len = arguments.length; i < len; i++){
receivingClass.prototype[arguments[i]] = givingClass.prototype[arguments[i]];
}
}else{//继承全部方法
for (methodName in givingClass.prototype){
if (!receivingClass.prototype[methodName]){
receivingClass.prototype[methodName] = givingClass.prototype[methodName];
}
}
}
}
var Mixin = function(){}//共用方法
Mixin.prototype = {
//...
}
augment(Author, Mixin, 'method1');//Author继承了Mixin中的method1方法
【推荐】还在用 ECharts 开发大屏?试试这款永久免费的开源 BI 工具!
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 从二进制到误差:逐行拆解C语言浮点运算中的4008175468544之谜
· .NET制作智能桌面机器人:结合BotSharp智能体框架开发语音交互
· 软件产品开发中常见的10个问题及处理方法
· .NET 原生驾驭 AI 新基建实战系列:向量数据库的应用与畅想
· 从问题排查到源码分析:ActiveMQ消费端频繁日志刷屏的秘密
· C# 13 中的新增功能实操
· 万字长文详解Text-to-SQL
· Ollama本地部署大模型总结
· 【杭电多校比赛记录】2025“钉耙编程”中国大学生算法设计春季联赛(4)
· 卧槽!C 语言宏定义原来可以玩出这些花样?高手必看!