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 相关文章推荐
一个简单的js动画效果代码
Jul 20 Javascript
js常用排序实现代码
Dec 28 Javascript
善用事件代理,警惕闭包的性能陷阱。
Jan 20 Javascript
使用非html5实现js板连连看游戏示例代码
Sep 22 Javascript
纯HTML5制作围住神经猫游戏-附源码下载
Aug 23 Javascript
一不小心就做错的JS闭包面试题
Nov 25 Javascript
js简单实现调整网页字体大小的方法
Jul 23 Javascript
利用C/C++编写node.js原生模块的方法教程
Jul 07 Javascript
jQuery位置选择器用法实例分析
Jun 28 jQuery
详解vue v-model
Aug 31 Javascript
antd的select下拉框因为数据量太大造成卡顿的解决方式
Oct 31 Javascript
VUE中鼠标滚轮使div左右滚动的方法详解
Dec 14 Vue.js
一个报数游戏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实现小型站点广告管理
2006/10/09 PHP
php 特殊字符处理函数
2008/09/05 PHP
php session劫持和防范的方法
2013/11/12 PHP
laravel Task Scheduling(任务调度)在windows下的使用详解
2019/10/22 PHP
jQuery一步一步实现跨浏览器的可编辑表格,支持IE、Firefox、Safari、Chrome、Opera
2009/08/28 Javascript
点击文章内容处弹出页面代码
2009/10/01 Javascript
js使用数组判断提交数据是否存在相同数据
2013/11/27 Javascript
javascript中全局对象的isNaN()方法使用介绍
2013/12/19 Javascript
JS遍历Json字符串中键值对先转成JSON对象再遍历
2014/08/15 Javascript
javascript实现复制与粘贴操作实例
2014/10/16 Javascript
JavaScript文档碎片操作实例分析
2015/12/12 Javascript
AngularJS ng-app 指令实例详解
2016/07/30 Javascript
使用jQuery,Angular实现登录界面验证码详解
2017/04/27 jQuery
js实现QQ面板拖拽效果(慕课网DOM事件探秘)(全)
2017/09/19 Javascript
vue中Npm run build 根据环境传递参数方法来打包不同域名
2018/03/29 Javascript
Vue.js实现数据响应的方法
2018/08/13 Javascript
VUE+Element UI实现简单的表格行内编辑效果的示例的代码
2018/10/31 Javascript
vue实现一拉到底的滑动验证
2019/07/25 Javascript
如何解决日期函数new Date()浏览器兼容性问题
2019/09/11 Javascript
js 实现watch监听数据变化的代码
2019/10/13 Javascript
Vuex中的Mutations的具体使用方法
2020/06/01 Javascript
vue 接口请求地址前缀本地开发和线上开发设置方式
2020/08/13 Javascript
JavaScript 判断浏览器是否是IE
2021/02/19 Javascript
[01:17]Ti4 循环赛第一日回顾
2014/07/11 DOTA
在Python的Django框架中编写编译函数
2015/07/20 Python
Python实现的多线程同步与互斥锁功能示例
2017/11/30 Python
python搭建服务器实现两个Android客户端间收发消息
2018/04/12 Python
pycharm中成功运行图片的配置教程
2018/10/28 Python
python3实现名片管理系统
2020/11/29 Python
python实现批量视频分帧、保存视频帧
2019/05/31 Python
解决python cv2.imread 读取中文路径的图片返回为None的问题
2020/06/02 Python
详解HTML5之pushstate、popstate操作history,无刷新改变当前url
2017/03/15 HTML / CSS
电气自动化自荐信
2013/10/10 职场文书
应届电子商务毕业自荐书范文
2014/02/11 职场文书
运动会3000米加油稿
2015/07/21 职场文书
小学生运动会广播
2015/08/19 职场文书