用方法封装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 异步调用框架 (Part 1 - 问题 &amp; 场景)
Aug 03 Javascript
javascript cookie操作类的实现代码小结附使用方法
Jun 02 Javascript
jQuery实现页面滚动时层智能浮动定位实例探讨
Mar 29 Javascript
JQuery给元素绑定click事件多次执行的解决方法
May 29 Javascript
原生JS和jQuery版实现文件上传功能
Apr 18 Javascript
javascript中利用柯里化函数实现bind方法【推荐】
Apr 29 Javascript
AngularJS上拉加载问题解决方法
May 23 Javascript
用jmSlip编写移动端顶部日历选择控件
Oct 24 Javascript
微信小程序开发之从相册获取图片 使用相机拍照 本地图片上传
Apr 18 Javascript
解决vue项目nginx部署到非根目录下刷新空白的问题
Sep 27 Javascript
jquery轮播图插件使用方法详解
Jul 31 jQuery
js实现扫雷源代码
Nov 27 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和ACCESS写聊天室(十)
2006/10/09 PHP
基于php的微信公众平台开发入门实例
2015/04/15 PHP
PHP自定义函数实现assign()数组分配到模板及extract()变量分配到模板功能示例
2018/05/23 PHP
laravel请求参数校验方法
2019/10/10 PHP
javascript实现点击商品列表checkbox实时统计金额的方法
2015/05/15 Javascript
AspNet中使用JQuery boxy插件的确认框
2015/05/20 Javascript
jQuery实现响应鼠标背景变化的动态菜单效果代码
2015/08/27 Javascript
深入学习AngularJS中数据的双向绑定机制
2016/03/04 Javascript
JS验证逗号隔开可以是中文字母数字
2016/04/22 Javascript
Javascript中的对象和原型(二)
2016/08/12 Javascript
jquery实现全选、不选、反选的两种方法
2016/09/06 Javascript
详解JavaScript中数组的reduce方法
2016/12/02 Javascript
详解vue-cli 构建Vue项目遇到的坑
2017/08/30 Javascript
nginx配置React静态页面的方法教程
2017/11/03 Javascript
Vue CLI3 开启gzip压缩文件的方式
2018/09/30 Javascript
实例讲解JavaScript预编译流程
2019/01/24 Javascript
js设置鼠标悬停改变背景色实现详解
2019/06/26 Javascript
Vue项目结合Vue-layer实现弹框式编辑功能(实例代码)
2020/03/11 Javascript
Javascript查看大图功能代码实现
2020/05/07 Javascript
[35:27]完美世界DOTA2联赛循环赛 GXR vs FTD BO2第二场 10.29
2020/10/29 DOTA
python使用WMI检测windows系统信息、硬盘信息、网卡信息的方法
2015/05/15 Python
python 每天如何定时启动爬虫任务(实现方法分享)
2018/05/21 Python
python根据url地址下载小文件的实例
2018/12/18 Python
Python3 安装PyQt5及exe打包图文教程
2019/01/08 Python
django实现支付宝支付实例讲解
2019/10/17 Python
详解python安装matplotlib库三种失败情况
2020/07/28 Python
Python接口自动化测试框架运行原理及流程
2020/11/30 Python
美国创意之家:BulbHead
2017/07/12 全球购物
彪马法国官网:PUMA法国
2019/12/15 全球购物
C++:memset ,memcpy和strcpy的根本区别
2013/04/27 面试题
外贸业务员工作职责
2014/01/06 职场文书
幼儿园安全检查制度
2014/01/30 职场文书
高一学生期末评语
2014/04/25 职场文书
Python基础之进程详解
2021/05/21 Python
Spring Boot 整合 Apache Dubbo的示例代码
2021/07/04 Java/Android
MySQL分库分表详情
2021/09/25 MySQL