用方法封装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修改表格背景色实例代码分享
Dec 10 Javascript
js获取checkbox复选框选中的选项实例
Aug 24 Javascript
JavaScript操作cookie类实例
Mar 31 Javascript
bootstrap——bootstrapTable实现隐藏列的示例
Jan 14 Javascript
Bootstrap Table从零开始
Jun 30 Javascript
vue的token刷新处理的方法
Jul 17 Javascript
深入理解 Koa 框架中间件原理
Oct 18 Javascript
浅谈KOA2 Restful方式路由初探
Mar 14 Javascript
移动端底部导航固定配合vue-router实现组件切换功能
Jun 13 Javascript
JavaScript浅层克隆与深度克隆示例详解
Sep 01 Javascript
js实现鼠标滑动到某个div禁止滚动
Sep 17 Javascript
Js类的构建与继承案例详解
Sep 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编写的导航条程序
2006/10/09 PHP
深入了解 register_globals (附register_globals=off 网站打不开的解决方法)
2012/06/27 PHP
php中禁止单个IP与ip段访问的代码小结
2012/07/04 PHP
php格式化金额函数分享
2015/02/02 PHP
IE与FireFox中的childNodes区别
2011/10/20 Javascript
两个数组去重的JS代码
2013/12/04 Javascript
nodejs之请求路由概述
2014/07/05 NodeJs
node.js中的fs.unlink方法使用说明
2014/12/15 Javascript
详解JavaScript表单验证(E-mail 验证)
2016/03/31 Javascript
js定义类的几种方法(推荐)
2016/06/08 Javascript
从零学习node.js之简易的网络爬虫(四)
2017/02/22 Javascript
Angular.js指令学习中一些重要属性的用法教程
2017/05/24 Javascript
关于页面刷新vuex数据消失问题解决方案
2017/07/03 Javascript
Angular 5.x 学习笔记之Router(路由)应用
2018/04/08 Javascript
详解Vue.js自定义tipOnce指令用法实例
2018/12/19 Javascript
js的对象与函数详解
2019/01/21 Javascript
js单线程的本质 Event Loop解析
2019/10/29 Javascript
[04:02]2014DOTA2国际邀请赛 BBC每日综述中国战队将再度登顶
2014/07/21 DOTA
[31:47]夜魇凡尔赛茶话会 第三期01:选手知多少
2021/03/11 DOTA
Python实现的使用telnet登陆聊天室实例
2015/06/17 Python
详解python的ORM中Pony用法
2018/02/09 Python
Python实现输出某区间范围内全部素数的方法
2018/05/02 Python
解决pycharm remote deployment 配置的问题
2019/06/27 Python
Python中栈、队列与优先级队列的实现方法
2019/06/30 Python
Python使用itchat 功能分析微信好友性别和位置
2019/08/05 Python
详解python中docx库的安装过程
2019/11/08 Python
详解pycharm2020.1.1专业版安装指南(推荐)
2020/08/07 Python
python爬虫破解字体加密案例详解
2021/03/02 Python
Html5上传图片 移动端、PC端通用代码
2016/06/08 HTML / CSS
CHARLES & KEITH英国官网:新加坡时尚品牌
2018/07/04 全球购物
美国香薰蜡烛品牌:PADDYWAX
2018/10/06 全球购物
GAZMAN官网:澳大利亚领先的男装品牌
2019/12/19 全球购物
公司员工检讨书
2014/02/08 职场文书
超越自我演讲稿
2014/05/21 职场文书
义诊活动总结
2015/02/04 职场文书
html css3不拉伸图片显示效果
2021/06/07 HTML / CSS