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 相关文章推荐
20款超赞的jQuery插件 Web开发人员必备
Feb 26 Javascript
myEvent.js javascript跨浏览器事件框架
Oct 24 Javascript
jQuery之end()和pushStack()使用介绍
Feb 07 Javascript
js添加table的行和列 具体实现方法
Jul 22 Javascript
js中通过split函数分割字符串成数组小例子
Sep 21 Javascript
jQuery实现图片轮播特效代码分享
Sep 15 Javascript
jQuery基于cookie实现的购物车实例分析
Dec 24 Javascript
AngularJs 禁止模板缓存的方法
Nov 28 Javascript
JS实现图片轮播效果实例详解【可自动和手动】
Apr 04 Javascript
jquery实现烟花效果(面向对象)
Mar 10 jQuery
Vue列表循环从指定下标开始的多种解决方案
Apr 08 Javascript
React Fragment介绍与使用详解
Nov 11 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
MySQL连接数超过限制的解决方法
2011/07/17 PHP
php使用iconv中文截断问题的解决方法
2015/02/11 PHP
php 实现Hash表功能实例详解
2016/11/29 PHP
Yii2实现自定义独立验证器的方法
2017/05/05 PHP
支持汉转拼和拼音分词的PHP中文工具类ChineseUtil
2018/02/23 PHP
Thinkphp 在api开发中异常返回依然是html的解决方式
2019/10/16 PHP
Javascript与flash交互通信基础教程
2008/08/07 Javascript
JavaScript编程开发中的五个实用小技巧
2010/07/22 Javascript
js自定义事件及事件交互原理概述(二)
2013/02/01 Javascript
如何用js控制frame的隐藏或显示的解决办法
2013/03/20 Javascript
js验证模型自我实现的具体方法
2013/06/21 Javascript
jQuery中noConflict()用法实例分析
2015/02/08 Javascript
jQuery+HTML5实现手机摇一摇换衣特效
2015/06/05 Javascript
JS基于cookie实现来宾统计记录访客信息的方法
2015/08/04 Javascript
javascript实现2016新年版日历
2016/01/25 Javascript
微信小程序 免费SSL证书https、TLS版本问题的解决办法
2016/12/14 Javascript
@ResponseBody 和 @RequestBody 注解的区别
2017/03/08 Javascript
bootstrap3使用bootstrap datetimepicker日期插件
2017/05/24 Javascript
详解vue-cli 接口代理配置
2017/12/13 Javascript
从parcel.js打包出错到选择nvm的全部过程
2018/01/23 Javascript
vue单页缓存存在的问题及解决方案(小结)
2018/09/25 Javascript
通过JQuery,JQueryUI和Jsplumb实现拖拽模块
2019/06/18 jQuery
vue 实现滚动到底部翻页效果(pc端)
2019/07/31 Javascript
Python2.5/2.6实用教程 入门基础篇
2009/11/29 Python
Python计算三角函数之asin()方法的使用
2015/05/15 Python
Python正则捕获操作示例
2017/08/19 Python
Linux-ubuntu16.04 Python3.5配置OpenCV3.2的方法
2018/04/02 Python
使用pyqt 实现重复打开多个相同界面
2019/12/13 Python
python redis存入字典序列化存储教程
2020/07/16 Python
Python大批量搜索引擎图像爬虫工具详解
2020/11/16 Python
举例详解HTML5中使用JSON格式提交表单
2015/06/16 HTML / CSS
盛大笔试题
2016/11/05 面试题
申报职称专业技术个人的自我评价
2013/12/12 职场文书
挂牌仪式主持词
2014/03/20 职场文书
MySQL 分页查询的优化技巧
2021/05/12 MySQL
Redis特殊数据类型HyperLogLog基数统计算法讲解
2022/06/01 Redis