用方法封装javascript的new操作符(一)


Posted in Javascript onDecember 25, 2010

先看个例子:

var Class = { 
create : function () { 
return function () { 
this.initialize.apply(this, arguments); 
} 
} 
} 
var A = Class.create(); 
A.prototype = { 
initialize:function(){ 
//todo 
} 
test:"abc" 
} 
var a = new A();

这是很多jser构建类和实例化对象的过程, 细心的人会发现: 实例化的a会多一个initialize方法。initialize在实例化时做为代理在实例化后就没有存在的意义了,而且有时候会引起不必要的麻烦,比如 for…in 语句遍历a时,会把initialize这个方法遍历出来。
我首先想到的是用前面博文中写的Class.js来做,这样就非常干净。但是在Class.js中的继承机制有一些bug的,在不入侵(即:不修改原型、不生成额外属性)的条件下,要实现接口更是难上加难了。于是我就想到封装new操作符,这样做的好处就是 可先修改原型,在封装new的方法中,实现继承、接口,并去除额外属性。
我们首先给new操作符的简单的实现一下:
function New(){//new是关键字,所以要区别一下 
var as = [],args = arguments; 
for(var i=1;i<args.length;i++){ 
as.push('args['+i+']'); 
} 
nobj = eval("new args[0]("+as.join(",")+");"); 
return nobj; 
} 
接下来测试一下: 
function A(n){ this.name = n;} 
var a1 = new A('ts'); 
alert(a1.name);//ts 
var a2 = New(A,'tangoboy'); 
alert(a2.name);//tangoboy 
测试成功,现在New方法基本可以代替new操作符实例化对象了。 
然后 解决文章开始的initialize问题就非常简单了: 
function New(){ 
var as = [],args = arguments; 
for(var i=1;i<args.length;i++){ 
as.push('args['+i+']'); 
} 
nobj = eval("new args[0]("+as.join(",")+");"); 
delete nobj.initialize;//删除实例化对象的方法 
return nobj; 
}

下一节开始丰富New方法。
Javascript 相关文章推荐
javascript中类的定义及其方式(《javascript高级程序设计》学习笔记)
Jul 04 Javascript
基于jquery实现图片广告轮换效果代码
Jul 07 Javascript
jquery.form.js用法之清空form的方法
Mar 07 Javascript
jquery访问ashx文件示例代码
Aug 11 Javascript
Bootstrap学习笔记之js组件(4)
Jun 12 Javascript
详解Angular之constructor和ngOnInit差异及适用场景
Jun 22 Javascript
js canvas实现红包照片效果
Aug 21 Javascript
微信小程序实现swiper切换卡内嵌滚动条不显示的方法示例
Dec 20 Javascript
详解element-ui日期时间选择器的日期格式化问题
Apr 08 Javascript
js判断浏览器的环境(pc端,移动端,还是微信浏览器)
Dec 24 Javascript
electron踩坑之remote of undefined的解决
Oct 06 Javascript
详解javascript脚本何时会被执行
Feb 05 Javascript
一些javascript一些题目的解析
Dec 25 #Javascript
javascript字符串拼接的效率问题
Dec 25 #Javascript
原生javascript获取元素样式属性值的方法
Dec 25 #Javascript
javascript中使用replaceAll()函数实现字符替换的方法
Dec 25 #Javascript
Javascript动态绑定事件的简单实现代码
Dec 25 #Javascript
浅析javascript闭包 实例分析
Dec 25 #Javascript
父子窗体间传递JSON格式的数据的代码
Dec 25 #Javascript
You might like
我的论坛源代码(九)
2006/10/09 PHP
怎样在PHP中通过ADO调用Asscess数据库和COM程序
2006/10/09 PHP
ThinkPHP中自定义目录结构的设置方法
2014/08/15 PHP
php实现遍历目录并删除指定文件中指定内容
2015/01/21 PHP
php实现paypal 授权登录
2015/05/28 PHP
Joomla简单判断用户是否登录的方法
2016/05/04 PHP
php结合md5的加密解密算法实例
2016/09/30 PHP
javascript之通用简单的table选项卡实现(二)
2010/05/09 Javascript
jQuery EasyUI API 中文文档 - Documentation 文档
2011/09/29 Javascript
Script标签与访问HTML页面详解
2014/01/10 Javascript
判断iframe里的页面是否加载完成
2014/06/06 Javascript
jQuery 和 CSS 的文本特效插件集锦
2014/12/12 Javascript
js HTML5多媒体影音播放
2016/10/17 Javascript
学习vue.js中class与style绑定
2016/12/03 Javascript
详解bootstrap的modal-remote两种加载方式【强化】
2017/01/27 Javascript
jquery 获取索引值在一定范围的列表方法
2018/01/25 jQuery
Vue实现跑马灯效果
2020/05/25 Javascript
Vuex的各个模块封装的实现
2020/06/05 Javascript
js实现三角形粒子运动
2020/09/22 Javascript
jQuery实现穿梭框效果
2021/01/19 jQuery
Python学习资料
2007/02/08 Python
Python查找两个有序列表中位数的方法【基于归并算法】
2018/04/20 Python
Django+Ajax+jQuery实现网页动态更新的实例
2018/05/28 Python
django表单实现下拉框的示例讲解
2018/05/29 Python
python matplotlib包图像配色方案分享
2020/03/14 Python
香港时尚女装购物网站:ZAFUL
2017/07/19 全球购物
自我推荐书
2013/12/04 职场文书
旷课检讨书1000字
2014/02/14 职场文书
人力资源管理专业自荐信
2014/06/24 职场文书
学校食堂食品安全责任书
2014/07/28 职场文书
2014年财务经理工作总结
2014/12/08 职场文书
2015年发展党员工作总结报告
2015/03/31 职场文书
安全生产隐患排查制度
2015/08/05 职场文书
学生会工作感言
2015/08/07 职场文书
那些美到让人窒息的诗句,值得你收藏!
2019/08/20 职场文书
Nginx的基本概念和原理
2022/03/21 Servers