用方法封装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 09 Javascript
Javascript Math ceil()、floor()、round()三个函数的区别
Mar 09 Javascript
jQuery中json对象的复制方式介绍(数组及对象)
Jun 08 Javascript
浅谈Javascript中深复制
Dec 01 Javascript
JavaScript中的数据类型转换方法小结
Oct 26 Javascript
Windows系统下安装Node.js的步骤图文详解
Nov 15 Javascript
Omi v1.0.2发布正式支持传递javascript表达式
Mar 21 Javascript
JS简单获取当前日期时间的方法(如:2017-03-29 11:41:10 星期四)
Mar 29 Javascript
js实现轮播图的两种方式(构造函数、面向对象)
Sep 30 Javascript
Angular浏览器插件Batarang介绍及使用
Feb 07 Javascript
对vue中methods互相调用的方法详解
Aug 30 Javascript
Vue中插槽slot的使用方法与应用场景详析
Jun 08 Vue.js
一些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
法压式咖啡之制作法
2021/03/03 冲泡冲煮
Ajax PHP 边学边练 之三 数据库
2009/11/26 PHP
php中用于检测一个地理IP地址是否可用的代码
2012/02/19 PHP
php判断正常访问和外部访问的示例
2014/02/10 PHP
PHP+MySql+jQuery实现的&quot;顶&quot;和&quot;踩&quot;投票功能
2016/05/21 PHP
PHP实现的多进程控制demo示例
2019/07/22 PHP
PHP封装请求类实例分析【基于Yii框架】
2019/10/17 PHP
如何在centos8自定义目录安装php7.3
2019/11/28 PHP
PHP7修改的函数
2021/03/09 PHP
js 字符串操作函数
2009/07/25 Javascript
File, FileReader 和 Ajax 文件上传实例分析(php)
2011/04/27 Javascript
可自己添加html的伪弹出框实现代码
2013/09/08 Javascript
select多选 multiple的使用示例
2014/06/16 Javascript
JavaScript实现单击下拉框选择直接跳转页面的方法
2015/07/02 Javascript
Js的Array数组对象详解
2016/02/22 Javascript
JS识别浏览器类型(电脑浏览器和手机浏览器)
2016/11/18 Javascript
基于javascript实现最简单选项卡切换
2017/02/01 Javascript
深入理解vue2.0路由如何配置问题
2017/07/18 Javascript
Vue中computed与methods的区别详解
2018/03/24 Javascript
vue keep-alive请求数据的方法示例
2018/05/16 Javascript
详解基于Vue cli生成的Vue项目的webpack4升级
2018/06/19 Javascript
什么时候不能在 Node.js 中使用 Lock Files
2019/06/24 Javascript
el-select 下拉框多选实现全选的实现
2019/08/02 Javascript
原生JavaScript实现日历功能代码实例(无引用Jq)
2019/09/23 Javascript
python检测服务器是否正常
2014/02/16 Python
python下读取公私钥做加解密实例详解
2017/03/29 Python
itchat接口使用示例
2017/10/23 Python
Python下opencv图像阈值处理的使用笔记
2019/08/04 Python
Python中的 sort 和 sorted的用法与区别
2019/08/10 Python
草莓网化妆品加拿大网站:Strawberrynet Canada
2016/09/20 全球购物
SOA面试题:如何在SOA中实现松耦合
2013/07/21 面试题
超市总经理岗位职责
2014/02/02 职场文书
文明演讲稿范文
2014/05/12 职场文书
优秀研究生主要事迹
2014/06/03 职场文书
一份教室追逐打闹的检讨书
2014/09/27 职场文书
教师拔河比赛广播稿
2014/10/14 职场文书