用方法封装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 学习笔记之基础中的基础
Jan 13 Javascript
jQuery点缩略图弹出层显示大图片
Feb 13 Javascript
超级简单实现JavaScript MVC 样式框架
Mar 24 Javascript
javascript 小数乘法结果错误的处理方法
Jul 28 Javascript
node.js中EJS 模板快速入门教程
May 08 Javascript
详解angularjs 关于ui-router分层使用
Jun 12 Javascript
微信小程序slider组件使用详解
Jan 31 Javascript
JS同步、异步、延迟加载的方法
May 05 Javascript
详解Vue项目中出现Loading chunk {n} failed问题的解决方法
Sep 14 Javascript
通过实例解析js简易模块加载器
Jun 17 Javascript
解决vue字符串换行问题(绝对管用)
Aug 06 Javascript
Vue父组件监听子组件生命周期
Sep 03 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的FTP学习(二)[转自奥索]
2006/10/09 PHP
smarty模板中拼接字符串的方法
2014/02/14 PHP
php的memcache类分享(memcache队列)
2014/03/26 PHP
Yii中render和renderPartial的区别
2014/09/03 PHP
php生成图片验证码的实例讲解
2015/08/03 PHP
laravel框架select2多选插件初始化默认选中项操作示例
2020/02/18 PHP
js中widow.open()方法使用详解
2013/07/30 Javascript
JQuery给元素绑定click事件多次执行的解决方法
2014/05/29 Javascript
jQuery获取URL请求参数的方法
2015/07/18 Javascript
jquery实现文本框textarea自适应高度
2016/03/09 Javascript
Vue服务端渲染和Vue浏览器端渲染的性能对比(实例PK )
2017/03/31 Javascript
jQuery实现base64前台加密解密功能详解
2017/08/29 jQuery
原生JS实现的多个彩色小球跟随鼠标移动动画效果示例
2018/02/01 Javascript
详解vscode中vue代码颜色插件
2018/10/11 Javascript
vscode中eslint插件的配置(prettier配置无效)
2019/09/10 Javascript
原生JS实现顶部导航栏显示按钮+搜索框功能
2019/12/25 Javascript
JavaScript链式调用原理与实现方法详解
2020/05/16 Javascript
python对象及面向对象技术详解
2016/07/19 Python
python实现Adapter模式实例代码
2018/02/09 Python
python生成以及打开json、csv和txt文件的实例
2018/11/16 Python
django的聚合函数和aggregate、annotate方法使用详解
2019/07/23 Python
Python使用Turtle库绘制一棵西兰花
2019/11/23 Python
在python中利用dict转json按输入顺序输出内容方式
2020/02/27 Python
python安装及变量名介绍详解
2020/12/12 Python
Html5 localStorage入门教程
2018/04/26 HTML / CSS
前端水印的简单实现代码示例
2020/12/02 HTML / CSS
英国网上香水店:Fragrance Direct
2016/07/20 全球购物
美国半成品食材配送服务商:Home Chef
2018/01/25 全球购物
HTC VIVE美国官网:VR虚拟现实眼镜
2018/02/13 全球购物
美国综合购物商城:UnbeatableSale.com
2018/11/28 全球购物
护士长2014年终工作总结
2014/11/11 职场文书
公诉意见书范文
2015/06/05 职场文书
恰同学少年观后感
2015/06/08 职场文书
2015年计算机教学工作总结
2015/07/22 职场文书
python - asyncio异步编程
2021/04/06 Python
flex弹性布局详解
2022/03/20 HTML / CSS