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 相关文章推荐
用jquery模仿的a的title属性(兼容ie6/7)
Jan 21 Javascript
js解析与序列化json数据(三)json的解析探讨
Feb 01 Javascript
jquery 取子节点及当前节点属性值的方法
Aug 24 Javascript
JavaScript实现的一个计算数字步数的算法分享
Dec 06 Javascript
深入了解JavaScript中的Symbol的使用方法
Jul 28 Javascript
bootstrap使用validate实现简单校验功能
Dec 02 Javascript
jQuery Ajax请求后台数据并在前台接收
Dec 10 Javascript
jQuery实现两个select控件的互移操作
Dec 22 Javascript
用js屏蔽被http劫持的浮动广告实现方法
Aug 10 Javascript
jQuery Ajax 实现分页 kkpager插件实例代码
Aug 10 jQuery
jQuery实现常见的隐藏与展示列表效果示例
Jun 04 jQuery
JavaScript通如何过RGraph实现动态仪表盘
Oct 15 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基于curl实现模拟微信浏览器打开微信链接的方法示例
2019/02/15 PHP
PHP全局使用Laravel辅助函数dd
2019/12/26 PHP
php使用pthreads v3多线程实现抓取新浪新闻信息操作示例
2020/02/21 PHP
许愿墙中用到的函数
2006/10/07 Javascript
比较新旧两个数组值得增加和删除的JS代码
2013/10/30 Javascript
21个JavaScript事件(Events)属性汇总
2014/12/02 Javascript
最新最热最实用的15个jQuery插件汇总
2015/07/05 Javascript
基于Javascript实现返回顶部按钮
2016/02/29 Javascript
基于Bootstrap实现图片轮播效果
2016/05/22 Javascript
jQuery layui常用方法介绍
2016/07/25 Javascript
任意Json转成无序列表的方法示例
2016/12/09 Javascript
bootstrap中的 form表单属性role=&quot;form&quot;的作用详解
2017/01/20 Javascript
React路由管理之React Router总结
2018/05/10 Javascript
微信小程序bindinput与bindsubmit的区别实例分析
2019/04/17 Javascript
浅谈Webpack4 Tree Shaking 终极优化指南
2019/11/18 Javascript
js实现炫酷光感效果
2020/09/05 Javascript
[04:11]2014DOTA2国际邀请赛 CIS遗憾出局梦想不灭
2014/07/09 DOTA
Python3.x版本中新的字符串格式化方法
2015/04/24 Python
利用Python进行异常值分析实例代码
2017/12/07 Python
Python比较2个时间大小的实现方法
2018/04/10 Python
python list删除元素时要注意的坑点分享
2018/04/18 Python
Scrapy使用的基本流程与实例讲解
2018/10/21 Python
python实现字符串完美拆分split()的方法
2019/07/16 Python
python 使用while循环输出*组成的菱形实例
2020/04/12 Python
Python数据库封装实现代码示例解析
2020/09/05 Python
numba提升python运行速度的实例方法
2021/01/25 Python
美国滑雪板和装备购物网站:Skis.com
2018/12/20 全球购物
澳大利亚头发和美容产品购物网站:OZ Hair & Beauty
2020/03/27 全球购物
国外软件测试工程师面试题
2016/12/09 面试题
校园活动策划方案
2014/06/13 职场文书
2014年维修电工工作总结
2014/11/20 职场文书
爱国主义主题班会
2015/08/14 职场文书
聊聊JS ES6中的解构
2021/04/29 Javascript
Dashboard管理Kubernetes集群与API访问配置
2022/04/01 Servers
SQL Server中的逻辑函数介绍
2022/05/25 SQL Server
Oracle 11g数据库使用expdp每周进行数据备份并上传到备份服务器
2022/06/28 Oracle