用方法封装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 相关文章推荐
cookie的复制与使用记住用户名实现代码
Nov 04 Javascript
extjs4 treepanel动态改变行高度示例
Dec 17 Javascript
JavaScript Math.floor方法(对数值向下取整)
Jan 09 Javascript
JS和css实现检测移动设备方向的变化并判断横竖屏幕
May 25 Javascript
javascript实现给定半径求出圆的面积
Jun 26 Javascript
超精准的javascript验证身份证号的具体实现方法
Nov 18 Javascript
javascript实现Email邮件显示与删除功能
Nov 21 Javascript
JavaScript实现ASC转汉字及汉字转ASC的方法
Jan 23 Javascript
JS+HTML5手机开发之滚动和惯性缓动实现方法分析
Jun 12 Javascript
慕课网题目之js实现抽奖系统功能
Sep 19 Javascript
浅谈Webpack下多环境配置的思路
Jun 27 Javascript
JS函数基本定义与用法示例
Jan 15 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冒泡排序算法的深入理解
2013/06/09 PHP
排序算法之PHP版快速排序、冒泡排序
2014/04/09 PHP
php实现递归抓取网页类实例
2015/04/03 PHP
PHP 计算两个特别大的整数实例代码
2018/05/07 PHP
javascript 模式设计之工厂模式详细说明
2010/05/10 Javascript
利用JS自动打开页面上链接的实现代码
2011/09/25 Javascript
jQuery jcrop插件截图使用方法
2013/11/20 Javascript
关于JS中的apply,call,bind的深入解析
2016/04/05 Javascript
jQ处理xml文件和xml字符串的方法(详解)
2016/11/22 Javascript
Vue数据驱动模拟实现4
2017/01/12 Javascript
使用vue.js2.0 + ElementUI开发后台管理系统详细教程(一)
2017/01/21 Javascript
js实现日历的简单算法
2017/01/24 Javascript
node.js利用redis数据库缓存数据的方法
2017/03/01 Javascript
Three.js如何实现雾化效果示例代码
2017/09/27 Javascript
vue实现评论列表功能
2019/10/25 Javascript
JavaScript实现简单动态表格
2020/12/02 Javascript
vue实现简易的双向数据绑定
2020/12/29 Vue.js
Python with的用法
2014/08/22 Python
编写Python的web框架中的Model的教程
2015/04/29 Python
Python3内置模块random随机方法小结
2019/07/13 Python
Python字符编码转码之GBK,UTF8互转
2020/02/09 Python
pytorch ImageFolder的覆写实例
2020/02/20 Python
Django media static外部访问Django中的图片设置教程
2020/04/07 Python
CSS3实现任意图片lowpoly动画效果实例
2017/05/11 HTML / CSS
AmazeUI 等分网格的实现示例
2020/08/25 HTML / CSS
Jacadi Paris英国官网:法国童装品牌
2019/08/09 全球购物
个人教师自我评价范文
2013/12/02 职场文书
餐饮管理自我介绍信
2014/01/15 职场文书
小学生红领巾广播稿
2014/01/21 职场文书
军训考核自我鉴定
2014/02/13 职场文书
团代会主持词
2014/04/02 职场文书
2014乡镇班子个人对照检查材料思想汇报
2014/09/26 职场文书
2015年国庆节广播稿
2015/08/19 职场文书
python通配符之glob模块的使用详解
2021/04/24 Python
JavaScript canvas实现流星特效
2021/05/20 Javascript
vue中 this.$set的使用详解
2021/11/17 Vue.js