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据option的value值快速设定初始的selected选项
Aug 13 Javascript
JQuery从头学起第二讲
Jul 04 Javascript
让JavaScript中setTimeout支持链式操作的方法
Jun 19 Javascript
Bootstrap入门书籍之(一)排版
Feb 17 Javascript
easy ui datagrid 从编辑框中获取值的方法
Feb 22 Javascript
JavaScript队列函数和异步执行详解
Jun 19 Javascript
基于vue配置axios的方法步骤
Nov 09 Javascript
浅谈React 服务器端渲染的使用
May 08 Javascript
微信小程序全局变量功能与用法详解
Jan 22 Javascript
js 将线性数据转为树形的示例代码
May 28 Javascript
vue插件--仿微信小程序showModel实现模态提示窗功能
Aug 19 Javascript
JSON stringify方法原理及实例解析
Oct 23 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
曾在DC漫画界反派角色扮演的演员,谁才是你心目中的小丑之王?
2020/04/09 欧美动漫
给多个地址发邮件的类
2006/10/09 PHP
PHP运行出现Notice : Use of undefined constant 的完美解决方案分享
2012/03/05 PHP
php如何获取文件的扩展名
2015/10/28 PHP
PHP各种异常和错误的拦截方法及发生致命错误时进行报警
2016/01/19 PHP
php中关于长度计算容易混淆的问题分析
2016/05/27 PHP
通过Mootools 1.2来操纵HTML DOM元素
2009/09/15 Javascript
jQuery示例收集
2010/11/05 Javascript
Js四则运算函数代码
2012/07/21 Javascript
jquery datepicker参数介绍和示例
2014/04/15 Javascript
DOM基础教程之使用DOM控制表格
2015/01/20 Javascript
jQuery实现图片渐入渐出切换展示效果
2015/08/15 Javascript
jQuery查看选中对象HTML代码的方法
2016/06/17 Javascript
Bootstrap进度条实现代码解析
2017/03/07 Javascript
vue代码分割的实现(codesplit)
2018/11/13 Javascript
JS脚本实现定时到网站上签到/签退功能
2020/04/22 Javascript
javascript 模块依赖管理的本质深入详解
2020/04/30 Javascript
JS倒计时两种实现方式代码实例
2020/07/27 Javascript
基于jquery实现彩色投票进度条代码解析
2020/08/26 jQuery
[01:02:45]完美世界DOTA2联赛 LBZS vs Forest 第三场 11.07
2020/11/09 DOTA
使用Python的Django框架实现事务交易管理的教程
2015/04/20 Python
python机器学习库xgboost的使用
2020/01/20 Python
深入了解Python装饰器的高级用法
2020/08/13 Python
Ubuntu16安装Python3.9的实现步骤
2020/12/15 Python
CSS3近阶段篇之酷炫的3D旋转透视
2016/04/28 HTML / CSS
HTML5 移动页面自适应手机屏幕四类方法总结
2017/08/17 HTML / CSS
T3官网:头发造型工具
2019/12/26 全球购物
《绿色蝈蝈》教学反思
2014/03/02 职场文书
工会换届选举方案
2014/05/21 职场文书
党支部班子“四风”问题自我剖析材料
2014/09/28 职场文书
交通事故赔偿协议书怎么写
2014/10/04 职场文书
医院领导班子查摆问题对照检查材料思想汇报
2014/10/08 职场文书
幼师小班个人总结
2015/02/12 职场文书
鲁滨孙漂流记读书笔记
2015/06/30 职场文书
食品安全主题班会
2015/08/13 职场文书
如何写好闭幕词
2019/04/02 职场文书