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实现的百度导航li拖放排列效果,即时更新数据库
Jul 31 Javascript
利用cookie记住背景颜色示例代码
Nov 04 Javascript
通过复制Table生成word和excel的javascript代码
Jan 20 Javascript
论Bootstrap3和Foundation5网格系统的异同
May 16 Javascript
ECMAScript6轮播图实践知识总结
Aug 17 Javascript
JavaScript严格模式详解
Jan 16 Javascript
详解Weex基于Vue2.0开发模板搭建
Mar 20 Javascript
vue中for循环更改数据的实例代码(数据变化但页面数据未变)
Sep 15 Javascript
微信小程序上传图片实例
May 28 Javascript
javascript使用substring实现的展开与收缩文字功能示例
Jun 17 Javascript
javascript设计模式 ? 外观模式原理与用法实例分析
Apr 15 Javascript
关于vue3默认把所有onSomething当作v-on事件绑定的思考
May 15 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 GD绘制24小时柱状图
2008/06/28 PHP
PHP之sprintf函数用法详解
2014/11/12 PHP
php使用Cookie控制访问授权的方法
2015/01/21 PHP
thinkphp制作404跳转页的简单实现方法
2016/09/22 PHP
thinkPHP中配置的读取与C方法详解
2016/12/05 PHP
PHP按一定比例压缩图片的方法
2018/10/12 PHP
PHP基于session.upload_progress 实现文件上传进度显示功能详解
2019/08/09 PHP
JQuery1.4+ Ajax IE8 内存泄漏问题
2010/10/15 Javascript
基于jquery的一个拖拽到指定区域内的效果
2011/09/21 Javascript
JS常见问题整理(持续更新)
2013/08/06 Javascript
javascript数字验证的实例代码(推荐)
2016/08/20 Javascript
原生JS版和jquery版实现checkbox的全选/全不选/点选/行内点选(Mr.Think)
2016/10/29 Javascript
微信小程序 http请求的session管理
2017/06/07 Javascript
JavaScript函数中的this四种绑定形式
2017/08/15 Javascript
如何理解Vue的作用域插槽的实现原理
2017/08/19 Javascript
webpack4的迁移的使用方法
2018/05/25 Javascript
angular6 填坑之sdk的方法
2018/12/27 Javascript
深入解析vue 源码目录及构建过程分析
2019/04/24 Javascript
JavaScript switch语句使用方法简介
2019/12/30 Javascript
原生JS实现拖拽效果
2020/12/04 Javascript
Python利用QQ邮箱发送邮件的实现方法(分享)
2017/06/09 Python
windows下python和pip安装教程
2018/05/25 Python
python实现比较文件内容异同
2018/06/22 Python
通过cmd进入python的实例操作
2019/06/26 Python
python3.6+django2.0+mysql搭建网站过程详解
2019/07/24 Python
基于Python的图像数据增强Data Augmentation解析
2019/08/13 Python
python操作yaml说明
2020/04/08 Python
python 元组和列表的区别
2020/12/30 Python
健康监测猫砂:Pretty Litter
2017/05/25 全球购物
一站式跨境收款解决方案:Payoneer(派安盈)
2018/09/06 全球购物
生态学毕业生自荐信
2013/10/27 职场文书
文言文形式的学生求职信
2013/12/03 职场文书
商场消防管理制度
2014/01/12 职场文书
陈安之励志演讲稿
2014/08/21 职场文书
技术股份合作协议书
2014/10/05 职场文书
担保书格式
2015/01/20 职场文书