用方法封装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官方 jQuery1.1.3发布,速度提升800%,体积保持20K
Aug 19 Javascript
Javascript数据结构与算法之列表详解
Mar 12 Javascript
jQuery图片轮播滚动切换代码分享
Apr 20 Javascript
AngularJS整合Springmvc、Spring、Mybatis搭建开发环境
Feb 25 Javascript
JavaScript中的prototype原型学习指南
May 09 Javascript
Javascript农历与公历相互转换的简单实例
Oct 09 Javascript
js实现的简练高效拖拽功能示例
Dec 21 Javascript
Jquery树插件zTree实现菜单树
Jan 24 Javascript
vue+webpack中配置ESLint
Nov 07 Javascript
vue-cli系列之vue-cli-service整体架构浅析
Jan 14 Javascript
记一次vue-webpack项目优化实践详解
Feb 17 Javascript
vue使用refs获取嵌套组件中的值过程
Mar 31 Vue.js
一些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获取和操作配置文件php.ini的几个函数介绍
2013/06/24 PHP
PHP面向对象继承用法详解(优化与减少代码重复)
2016/12/02 PHP
Zend Framework入门应用实例详解
2016/12/11 PHP
PHP+Ajax无刷新带进度条图片上传示例
2017/02/08 PHP
PHP的mysqli_rollback()函数讲解
2019/01/23 PHP
javascript级联下拉列表实例代码(自写)
2013/05/10 Javascript
今天是星期几的4种JS代码写法
2013/09/17 Javascript
通过隐藏iframe实现文件下载的js方法介绍
2014/02/26 Javascript
15个常用的jquery代码片段
2015/12/19 Javascript
JavaScript定时器实现的原理分析
2016/12/06 Javascript
javascript阻止事件冒泡和浏览器的默认行为
2017/01/21 Javascript
Angular 通过注入 $location 获取与修改当前页面URL的实例
2017/05/31 Javascript
react router 4.0以上的路由应用详解
2017/09/21 Javascript
Angular6封装http请求的步骤详解
2018/08/13 Javascript
js取小数点后两位四种方法
2019/01/18 Javascript
node.js微信小程序配置消息推送的实现
2019/02/13 Javascript
7个好用的JavaScript技巧分享(译)
2019/05/07 Javascript
JavaScript实现PC端横向轮播图
2020/02/07 Javascript
JavaScript实现动态生成表格
2020/08/02 Javascript
JS删除对象中某一属性案例详解
2020/09/08 Javascript
jquery实现图片放大镜效果
2020/12/23 jQuery
python制作小说爬虫实录
2017/08/14 Python
解决python报错MemoryError的问题
2018/06/26 Python
Python分支语句与循环语句应用实例分析
2019/05/07 Python
Python中asyncio模块的深入讲解
2019/06/10 Python
Python发展史及网络爬虫
2019/06/19 Python
python多线程并发实例及其优化
2019/06/27 Python
解决pytorch报错:AssertionError: Invalid device id的问题
2020/01/10 Python
pandas按照列的值排序(某一列或者多列)
2020/12/13 Python
CSS3盒子模型详解
2013/04/24 HTML / CSS
中职招生先进个人材料
2014/08/31 职场文书
少先队辅导员事迹材料
2014/12/24 职场文书
2015年推普周活动方案
2015/05/06 职场文书
2015年幼儿园保育工作总结
2015/05/12 职场文书
公安干警正风肃纪心得体会
2016/01/15 职场文书
centos8安装MongoDB的详细过程
2021/10/24 MongoDB