用方法封装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 数组的 uniq 方法
Jan 23 Javascript
通过jQuery源码学习javascript(二)
Dec 27 Javascript
jquery实现隐藏与显示动画效果/输入框字符动态递减/导航按钮切换
Jul 01 Javascript
JavaScript中创建类/对象的几种方法总结
Nov 29 Javascript
javascript计算用户打开网页的停留时间
Jan 09 Javascript
js显示文本框提示文字的方法
May 07 Javascript
vue-cli中安装方法(图文详细步骤)
Dec 12 Javascript
vue-router重定向和路由别名的使用讲解
Jan 19 Javascript
ES6 let和const定义变量与常量的应用实例分析
Jun 27 Javascript
Vue学习之常用指令实例详解
Jan 06 Javascript
JS实现网页烟花动画效果
Mar 10 Javascript
vue实现简单计算商品价格
Sep 14 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
再说下636单管机
2021/03/02 无线电
PHP入门教程之自定义函数用法详解(创建,调用,变量,参数,返回值等)
2016/09/11 PHP
php 计算两个时间相差的天数、小时数、分钟数、秒数详解及实例代码
2016/11/09 PHP
PHP实现根据数组的值进行分组的方法
2017/04/20 PHP
JS 参数传递的实际应用代码分析
2009/09/13 Javascript
js写一个弹出层并锁屏效果实现代码
2012/12/07 Javascript
基于jquery实现的文字向上跑动类似跑马灯的效果
2014/06/17 Javascript
Javascript实现飞动广告效果的方法
2015/05/25 Javascript
javascript实现加载xml文件的方法
2015/11/24 Javascript
Three.js学习之文字形状及自定义形状
2016/08/01 Javascript
浅谈js的html元素的父节点,子节点
2016/08/06 Javascript
JavaScript 中 apply 、call 的详解
2017/03/21 Javascript
基于代数方程库Algebra.js解二元一次方程功能示例
2017/06/09 Javascript
Vue2.0实现将页面中表格数据导出excel的实例
2017/08/09 Javascript
js异步编程小技巧详解
2017/08/14 Javascript
jQuery实现文件编码成base64并通过AJAX上传的方法
2018/04/12 jQuery
微信小程序实现单个或多个倒计时功能
2020/11/01 Javascript
[01:10]DOTA2次级职业联赛 - U5战队宣传片
2014/12/01 DOTA
python连接mysql数据库示例(做增删改操作)
2013/12/31 Python
Python语言实现获取主机名根据端口杀死进程
2016/03/31 Python
python如何在终端里面显示一张图片
2016/08/17 Python
详解python中executemany和序列的使用方法
2017/08/12 Python
Python实现字典(dict)的迭代操作示例
2018/06/05 Python
python matlibplot绘制多条曲线图
2021/02/19 Python
Python机器学习算法库scikit-learn学习之决策树实现方法详解
2019/07/04 Python
Python Django 封装分页成通用的模块详解
2019/08/21 Python
appium+python adb常用命令分享
2020/03/06 Python
使用Dajngo 通过代码添加xadmin用户和权限(组)
2020/07/03 Python
如何在vscode中安装python库的方法步骤
2021/01/06 Python
使用CSS3创建动态菜单效果
2015/07/10 HTML / CSS
用HTML5制作数字时钟的教程
2015/05/11 HTML / CSS
中国宠物用品商城:E宠商城
2016/08/27 全球购物
年度评优评先方案
2014/06/03 职场文书
2014乡党委副书记党建工作汇报材料
2014/11/02 职场文书
工作期间打牌检讨书范文
2014/11/20 职场文书
小学公民道德宣传日活动总结
2015/03/23 职场文书