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 相关文章推荐
9行javascript代码获取QQ群成员具体实现
Oct 16 Javascript
JQuery页面的表格数据的增加与分页的实现
Dec 10 Javascript
Javascript动态创建表格及删除行列的方法
May 15 Javascript
理解JavaScript的变量的入门教程
Jul 07 Javascript
基于jQuery实现复选框是否选中进行答题提示
Dec 10 Javascript
Bootstrap基本组件学习笔记之导航(10)
Dec 07 Javascript
ThinkJS中如何使用MongoDB的CURD操作
Dec 13 Javascript
如何提高Dom访问速度
Jan 05 Javascript
JavaScript函数表达式详解及实例
May 05 Javascript
React-native桥接Android原生开发详解
Jan 17 Javascript
Bootstrap模态对话框用法简单示例
Aug 31 Javascript
解决vue attr取不到属性值的问题
Sep 18 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 无限级 SelectTree 类
2009/05/19 PHP
ThinkPHP模板比较标签用法详解
2014/06/30 PHP
Laravel中使用Queue的最基本操作教程
2017/12/27 PHP
php7性能提升的原因详解
2019/10/13 PHP
JS模拟多线程
2007/02/07 Javascript
使用jQuery操作Cookies的实现代码
2011/10/09 Javascript
jQuery数据缓存功能的实现思路及简单模拟
2013/05/27 Javascript
window.open()详解及浏览器兼容性问题示例探讨
2014/05/29 Javascript
一个支持任意尺寸的图片上下左右滑动效果
2014/08/24 Javascript
Javascript模仿淘宝信用评价实例(附源码)
2015/11/26 Javascript
Vue中render函数的使用方法
2018/01/31 Javascript
vue刷新和tab切换实例
2018/02/11 Javascript
解决angularjs中同步执行http请求的方法
2018/08/13 Javascript
JavaScript实现简单音乐播放器
2020/04/17 Javascript
js实现简单模态框实例
2018/11/16 Javascript
el-input 标签中密码的显示和隐藏功能的实例代码
2019/07/19 Javascript
快速解决layui弹窗按enter键不停弹窗的问题
2019/09/18 Javascript
在Vue中获取自定义属性方法:data-id的实例
2020/09/09 Javascript
解决VueCil代理本地proxytable无效报错404的问题
2020/11/07 Javascript
python实现批量转换文件编码(批转换编码示例)
2014/01/23 Python
python中的reduce内建函数使用方法指南
2014/08/31 Python
Python网页解析利器BeautifulSoup安装使用介绍
2015/03/17 Python
python实现将pvr格式转换成pvr.ccz的方法
2015/04/28 Python
利用Python如何批量更新服务器文件
2018/07/29 Python
对python遍历文件夹中的所有jpg文件的实例详解
2018/12/08 Python
pandas DataFrame创建方法的方式
2019/08/02 Python
python 比较字典value的最大值的几种方法
2020/04/17 Python
使用CSS3来实现滚动视差效果的教程
2015/08/24 HTML / CSS
澳大利亚电子产品购物网站:Dick Smith
2017/02/02 全球购物
关于递归的一道.NET面试题
2013/05/12 面试题
办公室文秘自我鉴定
2013/09/21 职场文书
爱之链教学反思
2014/04/30 职场文书
乡镇八一建军节活动方案
2014/08/24 职场文书
党的群众路线教育实践活动督导组工作情况汇报
2014/10/28 职场文书
《初涉尘世》读后感3篇
2020/01/10 职场文书
MongoDB安装使用并实现Python操作数据库
2021/06/28 MongoDB