javascript 用原型继承来实现对象系统


Posted in Javascript onMarch 22, 2010

javascript中,对象没有原型,而构造器有原型
原型的含义:如果构造器有一个原型对象 A,则由该构造器创建的实例都必然复制自A

/*申明2个构造器*/ 
var flower=function(){ 
this.name="nokia"; 
} 
var flower2=function(){ 
this.age=22; 
} 
/*原型链*/ 
flower2.prototype=new flower(); 
/*根据刚才原型的定义,实例obj必然复制自new flower();*/ 
obj=new flowe2(); 
/*从父类继承的属性*/ 
alert(obj.name); //==>"nokia" 
alert(obj.age); //==>22

一个构造器产生的实例,其constructor属性默认总是指向该构造器
alert(obj.constructor);//==>flower
构造器原型的constructor属性 指向构造器本身
alert(flower.prototype.constructor==flower);//==>true
constructor会与原型继承发生的冲突
function flower(){} 
function flower2(){} 
flower2.prototype=new flower(); 
var obj1=new flower(); 
var obj2=new flower2(); 
/*问题出现了,2个实例的constructor属性都指向flower*/ 
alert(obj1.constructor==obj2.constructor); 
/*obj1和obj2是不同的构造器产生的实例,缺指向相同的构造器,显然出了问题*/

解决的方法
flower2.prototype=new flower(); 
/*重置原型后,修改原型的constructor属性*/ 
flower2.prototype.constructor=flower2 
或每次构造实例时都重写constructor属性 
function flower2(){ 
this.constructor=arguments.callee; 
} 
flower2.prototype=new flower();

此外原型继承没有提供调用父类的方法
然而我们基于原型继承,通过静态变量记录父类来弥补这一缺陷
var Class={ 
create:function() 
{ 
var _class=function() 
{ 
this.init.apply(this,arguments); 
} 
_class.prototype.init=Function.prototype.init; 
try{ 
return _class; 
}finally{ 
_class=null; 
} 
} 
}; 
//默认构造函数 
Function.prototype.init=function(){} 
//方法扩展 
Function.prototype.extend=function(list) 
{ 
for(var i in list)this.prototype[i]=list[i]; 
return this; 
} 
//多级继承 
Function.prototype.inherits=function(parent) 
{ 
//继承的深度级别 
var _depth=0; 
//方法属性移植 
this.extend(new parent()); 
//初始化构造函数 类的继承通常不继承构造函数 
this.prototype.init=Function.prototype.init; 
//类的静态父类 
this.parent=parent; 
//执行父类函数 
this.prototype.parent=function(name) 
{ 
//若没有参数则执行构造函数 
if(!name)name='init'; 
//即将执行的父类 
var _parent=parent; 
//若当前已经在父类中执行则继续向上寻找超类 
if(_depth) 
{ 
for(var i=0;i<_depth;i++) 
{ 
_parent=_parent.parent; 
} 
} 
//设置好级别 
_depth++; 
try{ 
//执行函数并返回值 
return _parent.prototype[name].apply(this,Array.prototype.slice.apply(arguments,[1])); 
}catch(e){ 
throw(e); 
}finally{ 
//恢复级别 
_depth--; 
} 
} 
return this; 
}

例子:
//创建名为class1的构造器 
var class1=Class.create().extend({ 
b:function() 
{ 
alert('clas'); 
alert(this.c); 
}, 
c:100 
}); 
//创建"对象"(构造器)的实例 
var s=new class1(); 
s.b();// ==>"clas",100

继承父类,并调用父类的方法:
var test=Class.create().inherits(class1).extend({ 
b:function() 
{ 
alert('test'); 
this.parent('b') 
}, 
c:110 
});
Javascript 相关文章推荐
关于javascript document.createDocumentFragment()
Apr 04 Javascript
js客户端快捷键管理类的较完整实现和应用
Jun 08 Javascript
js限制文本框为整数和货币的函数代码
Oct 13 Javascript
js获取select标签的值且兼容IE与firefox
Dec 30 Javascript
jquery中的$(document).ready()使用小结
Feb 14 Javascript
jQuery实现倒计时按钮功能代码分享
Sep 03 Javascript
javascript实现图片自动和可控的轮播切换特效
Apr 13 Javascript
Ajax跨域实现代码(后台jsp)
Jan 21 Javascript
vue2实现移动端上传、预览、压缩图片解决拍照旋转问题
Apr 13 Javascript
深入理解vue中的$set
Jun 01 Javascript
Vue.js框架路由使用方法实例详解
Aug 25 Javascript
Nuxt使用Vuex的方法示例
Sep 06 Javascript
用js实现的自定义的对话框的实现代码
Mar 21 #Javascript
简洁短小的 JavaScript IE 浏览器判定代码
Mar 21 #Javascript
jQuery实现表单input中提示文字value随鼠标焦点移进移出而显示或隐藏的代码
Mar 21 #Javascript
锋利的jQuery jQuery中的DOM操作
Mar 21 #Javascript
锋利的jQuery 要点归纳(一) jQuery选择器
Mar 21 #Javascript
jquery 可拖拽的窗体控件实现代码
Mar 21 #Javascript
jquery实现的元素的left增加N像素 鼠标移开会慢慢的移动到原来的位置
Mar 21 #Javascript
You might like
php 解决旧系统 查出所有数据分页的类
2012/08/27 PHP
一个简单的PHP验证码实现代码
2014/05/10 PHP
php实现微信企业转账功能
2018/10/02 PHP
PHP实现的62进制转10进制,10进制转62进制函数示例
2019/06/06 PHP
用jquery实现学校的校历(asp.net+jquery ui 1.72)
2010/01/01 Javascript
JavaScript 联动的无限级封装类,数据采用非Ajax方式,随意添加联动
2010/06/29 Javascript
javascript对象的使用和属性操作示例详解
2014/03/02 Javascript
原生js实现淘宝首页点击按钮缓慢回到顶部效果
2014/04/06 Javascript
浅析Node.js查找字符串功能
2014/09/03 Javascript
jQuery与JS加载事件用法分析
2016/09/04 Javascript
常用JS图片滚动(无缝、平滑、上下左右滚动)代码大全(推荐)
2016/12/20 Javascript
JQuery.dataTables表格插件添加跳转到指定页
2017/06/09 jQuery
Vue.js框架路由使用方法实例详解
2017/08/25 Javascript
微信小程序实现刷脸登录
2018/05/25 Javascript
微信小程序使用车牌号输入法的示例代码
2019/08/20 Javascript
Vue.js如何使用Socket.IO的示例代码
2019/09/05 Javascript
过滤器vue.filters的使用方法实现
2019/09/18 Javascript
Element-ui 自带的两种远程搜索(模糊查询)用法讲解
2021/01/29 Javascript
[00:39]DOTA2上海特级锦标赛 Liquid战队宣传片
2016/03/04 DOTA
[00:35]TI7不朽珍藏III——寒冰飞龙不朽展示
2017/07/15 DOTA
使用url_helper简化Python中Django框架的url配置教程
2015/05/30 Python
Python实现更改图片尺寸大小的方法(基于Pillow包)
2016/09/19 Python
Python编程求质数实例代码
2018/01/31 Python
Python爬虫抓取技术的一些经验
2019/07/12 Python
解析Python 偏函数用法全方位实现
2020/06/26 Python
英国灯具和灯泡网上商店:Lights.co.uk
2018/02/02 全球购物
卡西欧B级产品官方网站:Casio Outlet
2018/05/22 全球购物
德国价格合理的品牌商品购物网站:averdo
2019/03/21 全球购物
Linux中如何用命令创建目录
2015/01/12 面试题
售后主管岗位职责
2013/12/08 职场文书
大学新生欢迎词
2014/01/10 职场文书
师范学院教师自荐书
2014/01/31 职场文书
部门经理迟到检讨书
2015/02/16 职场文书
2015年大学生实习评语
2015/03/25 职场文书
确保减税降费落地生根,用实实在在措施
2019/07/19 职场文书
用Python创建简易网站图文教程
2021/06/11 Python