用方法封装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 EasyUI API 中文文档 - ComboBox组合框
Oct 07 Javascript
jquery索引在使用中的一些困惑
Oct 24 Javascript
jQuery中获取checkbox选中项等操作及注意事项
Nov 24 Javascript
jQuery实现鼠标悬停背景翻转的黑色导航菜单代码
Sep 14 Javascript
JavaScript function函数种类详解
Feb 22 Javascript
详解Javascript数据类型的转换规则
Dec 12 Javascript
JS时间控制实现动态效果的实例讲解
Jul 31 Javascript
关于JavaScript语句后面的分号问题
Dec 07 Javascript
JS与CSS3实现图片响应鼠标移动放大效果示例
May 04 Javascript
vue 项目中使用Loading组件的示例代码
Aug 31 Javascript
vue webpack重写cookie路径的方法
Jul 10 Javascript
jQuery使用jsonp实现百度搜索的示例代码
Jul 08 jQuery
一些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
COM in PHP (winows only)
2006/10/09 PHP
yii2实现 &quot;上一篇,下一篇&quot; 功能的代码实例
2017/02/04 PHP
PDO::setAttribute讲解
2019/01/29 PHP
PHP实现通过文本文件统计页面访问量功能示例
2019/02/13 PHP
PHP使用openssl扩展实现加解密方法示例
2020/02/20 PHP
如何通过PHP实现Des加密算法代码实例
2020/05/09 PHP
详解new function(){}和function(){}() 区别分析
2008/03/22 Javascript
javascript 读取XML数据,在页面中展现、编辑、保存的实现
2009/10/27 Javascript
网页中CDATA标记的说明
2010/09/12 Javascript
学习并汇集javascript匿名函数
2010/11/25 Javascript
JQuery 绑定select标签的onchange事件,弹出选择的值,并实现跳转、传参
2011/01/06 Javascript
xml转json的js代码
2012/08/28 Javascript
javascript 控制input只允许输入的各种指定内容
2014/06/19 Javascript
jQuery使用load()方法载入另外一个网页文件内的指定标签内容到div标签的方法
2015/03/25 Javascript
在Ubuntu系统上安装Ghost博客平台的教程
2015/06/17 Javascript
牛叉的Jquery——Jquery与DOM对象的互相转换及DOM的三种操作
2015/10/29 Javascript
浏览器调试动态js脚本的方法(图解)
2018/01/19 Javascript
JavaScript实现的简单加密解密操作示例
2018/06/01 Javascript
vee-validate vue 2.0自定义表单验证的实例
2018/08/28 Javascript
JavaScript错误处理操作实例详解
2019/01/04 Javascript
微信小程序实现展示评分结果功能
2019/02/15 Javascript
Vue+Express实现登录注销功能的实例代码
2019/05/05 Javascript
JS使用for in有序获取对象数据
2020/05/19 Javascript
Python selenium如何设置等待时间
2016/09/15 Python
Python实现获取照片拍摄日期并重命名的方法
2017/09/30 Python
基于Django的ModelForm组件(详解)
2017/12/07 Python
python实现图书管理系统
2018/03/12 Python
Python datetime包函数简单介绍
2019/08/28 Python
pytorch实现建立自己的数据集(以mnist为例)
2020/01/18 Python
django模型动态修改参数,增加 filter 字段的方式
2020/03/16 Python
Python requests及aiohttp速度对比代码实例
2020/07/16 Python
世界上最好的精品店:Shoptiques
2018/02/05 全球购物
香港艺人陈冠希创办的潮流品牌:JUICESTORE
2021/03/04 全球购物
《鲁班和橹板》教学反思
2014/04/27 职场文书
上海世博会口号
2014/06/19 职场文书
事业单位年度考核评语
2014/12/31 职场文书