用方法封装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中yield实用简洁实现方式
Jun 12 Javascript
Javascript图像处理—为矩阵添加常用方法
Dec 27 Javascript
WEB前端开发都应知道的jquery小技巧及jquery三个简写
Nov 15 Javascript
JS实现六边形3D拖拽翻转效果的方法
Sep 11 Javascript
JavaScript仿微博发布信息案例
Nov 16 Javascript
JavaScript中在光标处插入添加文本标签节点的详细方法
Mar 22 Javascript
BootStrap的双日历时间控件使用
Jul 25 Javascript
vue中各组件之间传递数据的方法示例
Jul 27 Javascript
详解webpack-dev-server的简单使用
Apr 02 Javascript
微信小程序支付功能 php后台对接完整代码分享
Jun 12 Javascript
Javascript读取上传文件内容/类型/字节数
Apr 30 Javascript
图解JS原型和原型链实现原理
Sep 15 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
PHP session会话操作技巧小结
2016/09/27 PHP
PHP5.5安装PHPRedis扩展及连接测试方法
2017/01/22 PHP
PHP + plupload.js实现多图上传并显示进度条加删除实例代码
2017/03/06 PHP
javascript 鼠标拖动图标技术
2010/02/07 Javascript
JavaScript中常见陷阱小结
2010/04/27 Javascript
Jquery实现鼠标移上弹出提示框、移出消失思路及代码
2013/05/19 Javascript
jQuery filter函数使用方法
2014/05/19 Javascript
jQuery源码解读之hasClass()方法分析
2015/02/20 Javascript
JS+CSS实现简易的滑动门效果代码
2015/09/24 Javascript
深入剖析JavaScript编程中的对象概念
2015/10/21 Javascript
浅析Javascript匿名函数与自执行函数
2016/02/06 Javascript
一道关于JavaScript变量作用域的面试题
2016/03/08 Javascript
用原生JS对AJAX做简单封装的实例代码
2016/07/13 Javascript
JS在Chrome浏览器中showModalDialog函数返回值为undefined的解决方法
2016/08/03 Javascript
jQuery Easyui datagrid连续发送两次请求问题
2016/12/13 Javascript
基于JavaScript实现全选、不选和反选效果
2017/02/15 Javascript
浅谈React Native 中组件的生命周期
2017/09/08 Javascript
如何用原生js写一个弹窗消息提醒插件
2019/05/24 Javascript
python实现文本去重且不打乱原本顺序
2016/01/26 Python
centos 安装python3.6环境并配置虚拟环境的详细教程
2018/02/22 Python
python随机在一张图像上截取任意大小图片的方法
2019/01/24 Python
Python实现的删除重复文件或图片功能示例【去重】
2019/04/23 Python
python主要用于哪些方向
2020/07/05 Python
详解Sticky Footer 绝对底部的两种套路
2017/11/03 HTML / CSS
HTML5中Canvas与SVG的画图原理比较
2013/01/16 HTML / CSS
JSF面试题:Jsf中的核心类用那些?有什么作用?LiftCycle六大生命周期是什么?
2014/07/17 面试题
为什么UNION ALL比UNION快
2016/03/17 面试题
电子商务专业自我鉴定
2013/12/18 职场文书
联谊活动策划书
2014/01/26 职场文书
关于护士节的演讲稿
2014/05/26 职场文书
学校安全防火方案
2014/06/07 职场文书
董事长助理工作职责范本
2014/07/01 职场文书
民间借贷协议书范本
2014/10/01 职场文书
扶贫办主任查摆“四风”问题个人对照检查材料思想汇报
2014/10/02 职场文书
学校总务处领导干部个人对照检查材料思想汇报
2014/10/06 职场文书
送给教师们,到底该如何写好教学反思?
2019/07/02 职场文书