js继承的实现代码


Posted in Javascript onAugust 05, 2010

base.js --继承的实现==========================
【注】:继承后,如果父类是一个类,则会继承其属性,方法(包括用prototype声明的),静态方法,否则只有属性和方法。

Object.prototype.extendf= function (a,b){ 
if(!a||!b) return; 
var fa = typeof a=="function"; 
var fb = typeof b=="function"; 
var cha = function(a,b){ 
for(var c in b){ 
if(a[c]==undefined)//子类重写 
a[c]=b[c]; 
} 
return a;//返回继承后的对象 
} 
if(fa&&fb){ 
b.apply(this,a.arguments); 
cha(a,b); 
this["base"] =new b;//通过base访问父类 
return cha(this,b.prototype); 
} 
else if(!fa&&fb){ 
cha(a,new b); 
a["base"]= new b; 
return cha(a,b); 
}else if(fa&&!fb){ 
cha(a,b); 
this["base"]=b; 
return cha(this,b); 
}else if(!fa&&!fb){ 
a["base"]=b; 
return cha(a,b); 
} 
}

测试页:用法
<html> 
<head> 
<script type="text/javascript" src="base.js"></script> 
<script type="text/javascript"> 
var car2 = { 
name:"轿车【父类】", 
price:"几万【父类】", 
start : function(){ 
alert(this.name+" 已启动2!【父类】"); 
}, 
run : function(){ 
alert(this.name+" 在行驶当中2。。。【父类】"); 
}, 
stop: function(){ 
alert(this.name+" 已停止2!【父类】"); 
}, 
remark: function(){return "【父类】2我是一辆 "+this.name+";价值 "+this.price;} 
// this.remark = "我是一辆 "+this.name+";价值 "+this.price; 
} 
//car2.prototype.extra = function(ext){ 
// return this.name+" 的关税2是:"+ext; 
//} 
car2.protect = "【父类】2保护的"; 
car2.noExtra = function(){ 
return car.protect+" 不交关税2【父类】"; 
} 
var car = function(name,price){ 
this.name=name||"轿车 [父类]"; 
this.price=price||"几万[父类]"; 
this.start = function(){ 
alert(this.name+" 已启动![父类]"); 
}; 
this.run = function(){ 
alert(this.name+" 在行驶当中。。。[父类]"); 
}; 
this.stop= function(){ 
alert(this.name+" 已停止![父类]"); 
}; 
this.remark = function(){return "[父类]我是一辆 "+this.name+";价值 "+this.price;}; 
// this.remark = "我是一辆 "+this.name+";价值 "+this.price; //注意,这样做 name 和price 将得不到传参,故注释 
} 
car.prototype.extra = function(ext){ 
return this.name+" 的关税是[父类]:"+ext; 
} 
car.protect = "[父类]保护的"; 
car.noExtra = function(){ 
return car.protect+" 不交关税[父类]"; 
} 
var BMW = function(){ 
this.extendf(BMW,car); 
this.name = "BMW【子类】"; 
this.start=function(){ 
alert(this.name+"专属 启动装置!"); 
}; 
return ("this.name1="+this.name); 
} 
var BMW2 = function(){ 
this.extendf(BMW2,car2); 
this.name = "宝马终极2号【子类】"; 
this.start=function(){ 
alert(this.name+" 专属 启动装置2号未来!"); 
}; 
return ("this.name1="+this.name); 
} 
var bensi = { 
name:"bensi", 
price:"130万", 
start:function(){ 
alert(this.name+" 华丽启动!"); 
}, 
stop:function(){ 
alert(this.name+" 专用刹车停止!"); 
} 
} 
bensi.noExtra=function(){ 
return "谁敢收税?"; 
} 
var autuo = { 
name:"autuo【子类】", 
price:"1万", 
stop:function(){ 
alert(this.name+" 奥拓失灵了!"); 
} 
} 
function ChangAn(){ 
this.extendf(ChangAn,car); 
// this.name = "CHANGAN【子类】"; 
this.run=function(){ 
alert(this.name+" 走的有点慢。。。"); 
} 
} 
var ftest = function(){ 
var tb = new BMW("宝马","70万"); 
testRun(tb); 
alert(BMW.noExtra()); 
} 
var ftest2 = function(){ 
var tb = bensi//("奔驰","120万"); 
tb.extendf(bensi,car); 
testRun(bensi); 
alert(bensi.noExtra()); 
} 
var ftest3 = function(){ 
var tb = new ChangAn("长安[传参]","5万"); 
testRun(tb); 
alert(ChangAn.noExtra()); 
} 
var ftest4 = function(){ 
var tb = autuo 
tb.extendf(autuo,car2); 
testRun(tb); 
alert(autuo.noExtra()); 
} 
var ftest5 = function(){ 
var tb = autuo 
tb.extendf(autuo,bensi); 
alert(tb.name); 
tb.start(); 
tb.stop(); 
alert(autuo.noExtra()); 
} 
var ftest6 = function(){ 
var tb = new BMW2("宝马2号","65万"); 
var scar = document.getElementById("showcar"); 
scar.innerHTML = tb.remark(); 
alert(tb.name); 
tb.start(); 
tb.stop(); 
alert(BMW2.noExtra()); 
} 
//测试输出 
function testRun(tb){ 
var scar = document.getElementById("showcar"); 
if(!scar) return false; 
scar.innerHTML = tb.remark(); 
tb.base.start(); 
tb.start(); 
tb.base.run(); 
tb.run(); 
tb.base.stop(); 
tb.stop(); 
alert(tb.extra("1万"));//父类为Object时这个会出错,因为父类本身就没有 
} 
</script> 
</head> 
<body> 
js测试: 
<input type = "button" value = "宝马" onclick = "ftest()" > 
<input type = "button" value = "奔驰" onclick = "ftest2()" > 
<input type = "button" value = "长安" onclick = "ftest3()" > 
<input type = "button" value = "奥拓" onclick = "ftest4()" > 
<input type = "button" value = "奔驰类的奥拓" onclick = "ftest5()" > 
<input type = "button" value = "宝马2号" onclick = "ftest6()" > 
<div id = "showcar"></div> 
</body> 
</html>

ps:没有注意到性能问题,往大家改善
想只用一个参数,不知道大家有没有办法?
嵌套类 没试过。
Javascript 相关文章推荐
jquery checkbox全选、取消全选实现代码
Mar 05 Javascript
window.open()实现post传递参数
Mar 12 Javascript
浅谈Sizzle的“编译原理”
Apr 14 Javascript
JavaScript中instanceof运算符的使用示例
Jun 08 Javascript
Vuejs第十三篇之组件——杂项
Sep 09 Javascript
axios中cookie跨域及相关配置示例详解
Dec 20 Javascript
解决layui中的form表单与button的点击事件冲突问题
Aug 15 Javascript
对vue下点击事件传参和不传参的区别详解
Sep 15 Javascript
详解vue父子组件关于模态框状态的绑定方案
Jun 05 Javascript
node.js实现带进度条的多文件上传
Mar 27 Javascript
JS数组方法concat()用法实例分析
Jan 18 Javascript
vue项目接口域名动态获取操作
Aug 13 Javascript
一个报数游戏js版(约瑟夫环问题)
Aug 05 #Javascript
JS 实现完美include载入实现代码
Aug 05 #Javascript
使用ExtJS技术实现的拖动树结点
Aug 05 #Javascript
JavaScript 获取当前时间戳的代码
Aug 05 #Javascript
firefox事件处理之自动查找event的函数(用于onclick=foo())
Aug 05 #Javascript
Js获取事件对象代码
Aug 05 #Javascript
zeroclipboard复制到剪切板的flash
Aug 04 #Javascript
You might like
约瑟夫环问题的PHP实现 使用PHP数组内部指针操作函数
2010/10/12 PHP
解析php file_exists无效的解决办法
2013/06/26 PHP
PHP7正式版测试,性能惊艳!
2015/12/08 PHP
Yii2 加载css、js 载静态资源的方法
2017/03/10 PHP
PHP简单实现解析xml为数组的方法
2018/05/02 PHP
php多进程应用场景实例详解
2019/07/22 PHP
PHP swoole和redis异步任务实现方法分析
2019/08/12 PHP
javascript之ESC(第二类混淆)
2007/05/06 Javascript
判断浏览器的javascript版本的代码
2010/09/03 Javascript
JavaScript全局函数使用简单说明
2011/03/11 Javascript
Javascript Request获取请求参数如何实现
2012/11/28 Javascript
jQuery阻止同类型事件小结
2013/04/19 Javascript
JavaScript1.6数组新特性介绍以及JQuery的几个工具方法
2013/12/06 Javascript
nodejs读取memcache示例分享
2014/01/02 NodeJs
Javascript玩转继承(二)
2014/05/08 Javascript
纯js实现遮罩层效果原理分析
2014/05/27 Javascript
js实现textarea限制输入字数
2017/02/13 Javascript
Bootstrap图片轮播效果详解
2017/10/17 Javascript
微信小程序图片轮播组件gallery slider使用方法详解
2018/01/31 Javascript
Bootstrap实现可折叠分组侧边导航菜单
2018/03/07 Javascript
分析Python中设计模式之Decorator装饰器模式的要点
2016/03/02 Python
Python 使用with上下文实现计时功能
2018/03/09 Python
Python数据类型之列表和元组的方法实例详解
2019/07/08 Python
CSS3中使用RGBa来调节透明度的教程
2016/05/09 HTML / CSS
TripAdvisor瑞典:全球领先的旅游网站
2017/12/11 全球购物
重新定义牛仔布,100美元以下:Warp + Weft
2018/07/25 全球购物
教育学专业毕业生的自我评价
2013/11/21 职场文书
操行评语大全
2014/04/30 职场文书
机械设计专业大学生职业生涯规划书范文
2014/09/13 职场文书
城市轨道交通工程职业生涯规划书范文
2014/09/16 职场文书
六查六看自检自查剖析材料
2014/10/14 职场文书
学生检讨书怎么写
2015/05/07 职场文书
导游词之无锡唐城
2019/12/12 职场文书
Python中OpenCV实现简单车牌字符切割
2021/06/11 Python
Js类的构建与继承案例详解
2021/09/15 Javascript
Python字符串的转义字符
2022/04/07 Python