用方法封装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 相关文章推荐
jQuery 相关控件的事件操作分解
Aug 03 Javascript
JavaScript中将一个值转换为字符串的方法分析[译]
Sep 21 Javascript
js获取php变量的实现代码
Aug 10 Javascript
js中通过父级进行查找定位元素
Jun 15 Javascript
多种方法实现360浏览器下禁止自动填写用户名密码
Jun 16 Javascript
关于延迟加载JavaScript
May 05 Javascript
Javascript使用uploadify来实现多文件上传
Nov 16 Javascript
JS中正则表达式全局匹配模式 /g用法详解
Apr 01 Javascript
JavaScript字符串检索字符的方法
Jun 23 Javascript
Angular4学习笔记之根模块与Ng模块
Sep 09 Javascript
使用vue自定义指令开发表单验证插件validate.js
May 23 Javascript
js中关于Blob对象的介绍与使用
Nov 29 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获得用户使用的代理服务器ip即真实ip
2006/12/31 PHP
thinkPHP显示不出验证码的原因与解决方法分析
2017/05/20 PHP
php微信开发之音乐回复功能
2018/06/14 PHP
SWFObject Flash js调用类
2008/07/08 Javascript
15 个 JavaScript Web UI 库
2010/05/19 Javascript
javascript smipleChart 简单图标类
2011/01/12 Javascript
PHP中CURL的几个经典应用实例
2015/01/23 Javascript
javascript中createElement的两种创建方式
2015/05/14 Javascript
Bootstrap精简教程
2015/11/27 Javascript
浅析Javascript匿名函数与自执行函数
2016/02/06 Javascript
使用jQuery操作HTML的table表格的实例解析
2016/03/13 Javascript
javascript稀疏数组(sparse array)和密集数组用法分析
2016/12/28 Javascript
Angularjs验证用户输入的字符串是否为日期时间
2017/06/01 Javascript
详谈AngularJs 控制器、数据绑定、作用域
2017/07/09 Javascript
微信小程序实现团购或秒杀批量倒计时
2020/11/01 Javascript
浅谈Python爬取网页的编码处理
2016/11/04 Python
Python 中 Virtualenv 和 pip 的简单用法详解
2017/08/18 Python
python编程之requests在网络请求中添加cookies参数方法详解
2017/10/25 Python
pandas数据清洗,排序,索引设置,数据选取方法
2018/05/18 Python
pyqt5使用按钮进行界面的跳转方法
2019/06/19 Python
python程序中的线程操作 concurrent模块使用详解
2019/09/23 Python
python生成并处理uuid的实现方式
2020/03/03 Python
python中selenium库的基本使用详解
2020/07/31 Python
CSS3实现的炫酷菜单代码分享
2015/03/12 HTML / CSS
Java中采用什么结构来捕获、处理异常?各子句的顺序、功能如何
2013/10/07 面试题
招聘专员岗位职责
2014/03/07 职场文书
中学校庆方案
2014/03/17 职场文书
认购协议书范本
2014/04/22 职场文书
关于雷锋的演讲稿
2014/05/10 职场文书
环保建议书500字
2014/05/14 职场文书
企业人事任命书
2014/06/05 职场文书
民政局离婚协议书范本
2014/10/20 职场文书
2014年个人工作总结报告
2014/11/27 职场文书
郭明义电影观后感
2015/06/08 职场文书
拔河比赛队名及霸气口号
2015/12/24 职场文书
2016年社会管理综治宣传月活动总结
2016/03/16 职场文书