用方法封装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 相关文章推荐
js脚本学习 比较实用的基础
Sep 07 Javascript
为Extjs加加速(javascript加速)
Aug 19 Javascript
Javascript 面向对象编程(一) 封装
Aug 28 Javascript
javascript 利用Image对象实现的埋点(某处的点击数)统计
Dec 28 Javascript
使用jQuery清空file文件域的解决方案
Apr 12 Javascript
开发插件的两个方法jquery.fn.extend与jquery.extend
Nov 21 Javascript
innerHTML,outerHTML,innerText,outerText的用法及区别解析
Dec 16 Javascript
jquery 删除节点 添加节点 找兄弟节点的简单实现
Dec 07 Javascript
js中常用的Math方法总结
Jan 12 Javascript
Vue按需加载的具体实现
Dec 02 Javascript
vscode 插件开发 + vue的操作方法
Jun 05 Javascript
JS实现手风琴特效
Nov 08 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递归列出所有文件和目录的代码
2008/09/10 PHP
PHP类的使用 实例代码讲解
2009/12/28 PHP
PHP zlib扩展实现页面GZIP压缩输出
2010/06/17 PHP
分享一下贝贝成长进度的php代码
2012/09/14 PHP
浅析Apache中RewriteCond规则参数的详细介绍
2013/06/30 PHP
php绘图之加载外部图片的方法
2015/01/24 PHP
Zend Framework框架Smarty扩展实现方法
2016/03/22 PHP
A标签中通过href和onclick传递的this对象实现思路
2013/04/19 Javascript
动态添加option及createElement使用示例
2014/01/26 Javascript
js控制当再次点击按钮时的间隔时间
2014/06/03 Javascript
jQuery多个input求和的实现方法
2015/02/12 Javascript
jQuery中$.ajax()和$.getJson()同步处理详解
2015/08/12 Javascript
基于JS实现移动端访问PC端页面时跳转到对应的移动端网页
2020/12/24 Javascript
jQuery选择器基础入门教程
2016/05/10 Javascript
jQuery删除节点用法示例(remove方法)
2016/09/08 Javascript
js中获取键盘事件的简单实现方法
2016/10/10 Javascript
JS实现的简单轮播图运动效果示例
2016/12/22 Javascript
Vue 2.X的状态管理vuex记录详解
2017/03/23 Javascript
解决angularjs service中依赖注入$scope报错的问题
2018/10/02 Javascript
angular4笔记系列之内置指令小结
2018/11/09 Javascript
微信小程序实现分享朋友圈的图片功能示例
2019/01/18 Javascript
javascript执行上下文、变量对象实例分析
2020/04/25 Javascript
[33:15]2018DOTA2亚洲邀请赛3月30日 小组赛B组 VP VS Mineski
2018/03/31 DOTA
Python数据结构与算法之使用队列解决小猫钓鱼问题
2017/12/14 Python
Python+OpenCV+pyQt5录制双目摄像头视频的实例
2019/06/28 Python
python双向链表原理与实现方法详解
2019/12/03 Python
python  ceiling divide 除法向上取整(或小数向上取整)的实例
2019/12/27 Python
英国马匹装备和马术用品购物网站:Equine Superstore
2019/03/03 全球购物
用Java语言将一个键盘输入的数字转化成中文输出
2013/01/25 面试题
会计岗位描述
2014/02/22 职场文书
《一个小村庄的故事》教学反思
2014/04/13 职场文书
房屋租房协议书范本
2014/12/04 职场文书
小学教师求职信范文
2015/03/20 职场文书
2015年农村党员干部主题教育活动总结
2015/03/25 职场文书
MySQL基于索引的压力测试的实现
2021/11/07 MySQL
mysql查找连续出现n次以上的数字
2022/05/11 MySQL