用方法封装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 变量作用域 代码分析
Jun 26 Javascript
node.js超时timeout详解
Nov 26 Javascript
js脚本实现数据去重
Nov 27 Javascript
跟我学习javascript的this关键字
May 28 Javascript
JQuery.validate在ie8下不支持的快速解决方法
May 18 Javascript
AngularJS Controller作用域
Jan 09 Javascript
Node.js 回调函数实例详解
Jul 06 Javascript
vue中eventbus被多次触发以及踩过的坑
Dec 02 Javascript
浅谈webpack devtool里的7种SourceMap模式
Jan 14 Javascript
React 使用Hooks简化受控组件的状态绑定
Mar 18 Javascript
小程序如何定位所在城市及发起周边搜索
Feb 11 Javascript
leaflet加载geojson叠加显示功能代码
Feb 21 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
Win2000+Apache+MySql+PHP4+PERL安装使用小结
2006/10/09 PHP
php结合飞信 免费天气预报短信
2009/05/07 PHP
Pain 全世界最小最简单的PHP模板引擎 (普通版)
2011/10/23 PHP
PHP魔术方法使用方法汇总
2016/02/14 PHP
php中html_entity_decode实现HTML实体转义
2018/06/13 PHP
PHP堆栈调试操作简单示例
2018/06/15 PHP
JAVASCRIPT  THIS详解 面向对象
2009/03/25 Javascript
Js 刷新框架页的代码
2010/04/13 Javascript
Jquery实现鼠标移上弹出提示框、移出消失思路及代码
2013/05/19 Javascript
用JS将搜索的关键字高亮显示实现代码
2013/11/08 Javascript
js获取页面description的方法
2015/05/21 Javascript
JavaScript中0和&quot;&quot;比较引发的问题
2016/05/26 Javascript
React-Native之定时器Timer的实现代码
2017/10/04 Javascript
Vue2.0用户权限控制解决方案的示例
2018/02/10 Javascript
使用D3.js+Vue实现一个简单的柱形图
2018/08/05 Javascript
Vue登录注册并保持登录状态的方法
2018/08/17 Javascript
微信小程序自定义组件传值 页面和组件相互传数据操作示例
2019/05/05 Javascript
vue日历/日程提醒/html5本地缓存功能
2019/09/02 Javascript
vue页面更新patch的实现示例
2020/03/25 Javascript
jQuery实现电梯导航模块
2020/12/22 jQuery
python学习笔记:字典的使用示例详解
2014/06/13 Python
Python 遍历列表里面序号和值的方法(三种)
2017/02/17 Python
Python3中在Anaconda环境下安装basemap包
2018/10/21 Python
Django开发的简易留言板案例详解
2018/12/04 Python
python+pygame实现坦克大战小游戏的示例代码(可以自定义子弹速度)
2020/08/11 Python
python爬取天气数据的实例详解
2020/11/20 Python
基于Python实现天天酷跑功能
2021/01/06 Python
HTML5给汉字加拼音收起展开组件的实现代码
2020/04/08 HTML / CSS
MIRTA官网:手工包,100%意大利制造
2020/02/11 全球购物
init进程的作用
2012/04/12 面试题
生产车间主管岗位职责
2013/12/28 职场文书
计算机专业毕业生自我鉴定
2014/01/16 职场文书
煤矿安全演讲稿
2014/05/09 职场文书
志愿者活动总结报告
2014/06/27 职场文书
拾金不昧表扬信
2015/01/16 职场文书
MySQL完整性约束的定义与实例教程
2021/05/30 MySQL