JavaScript中的new的使用方法与注意事项


Posted in Javascript onMay 16, 2007
原文: JavaScript, We Hardly new Ya  --Douglas Crockford。    
http://yuiblog.com/blog/2006/11/13/javascript-we-hardly-new-ya/
引用
JavaScript是一门基于原型的语言,但它却拥有一个 new 操作符使得其看起来象一门经典的面对对象语言。那样也迷惑了程序员们,导致一些有问题的编程模式。

其实你永远不需要在JavaScript使用 new Object()。用字面量的形式{}去取代吧。

同理,不要使用 new Array() ,而代之以字面量[]。JavaScript中的数组并不象Java中的数组那样工作的,使用类似Java的语法只会让你糊涂。

同理不用使用 new Number, new String, 或者 new Boolean。这些的用法只会产生无用的类型封装对象。就直接使用简单的字面量吧。

不要使用 new Function 去创建函数对象。用函数表达式更好。比如:

frames[0].onfocus = new Function(”document.bgColor='antiquewhite'”)

更好的写法是:

frames[0].onfocus = function () {document.bgColor = ‘antiquewhite';};

第二种形式让脚本编译器更快的看到函数主体,于是其中的语法错误也会更快被检测出来。有时候程序员使用 new Function 是因为他们没有理解内部函数是如何工作的。

selObj.onchange = new Function(”dynamicOptionListObjects[”+
       dol.index+”].change(this)”);

如果我们让用字符串做函数体,编译器不能看到它们。如果我们用字符串表达式做函数体,我们同样也看不到它们。更好的方式就是不要盲目编程。通过制造一个返回值为函数的函数调用,我们可以明确的按值传递我们想要绑定的值。这允许我们在循环中初始化一系列 selObj 对象。

selObj.onchange = function (i) {
   return function () {
       dynamicOptionListObjects[i].change(this);

   };
}(dol.index);

直接对一个函数使用new永远不是一个好主意。比如, new function 对构造新对象没有提供什么优势。

myObj = new function () {
   this.type = ‘core';
};

更好的方式是使用对象字面量,它更轻巧,更快捷。

myObj = {
   type: ‘core'
};

假如我们需要创建的对象包含的方法需要访问私有变量或者函数,更好的方式仍然是避免使用new.

var foo = new function() {
   function processMessages(message) {
       alert(”Message: ” + message.content);
   }
   this.init = function() {
       subscribe(”/mytopic”, this, processMessages);
   }
}

通过使用 new 去调用函数,对象会持有一个无意义的原型对象。这只会浪费内存而不会带来任何好处。如果我们不使用new,我们就不用在对象链维护一个无用的prototype对象。所以我们可以用()来正确的调用工厂函数。

var foo = function () {
   function processMessages(message) {
       alert(”Message: ” + message.content);
   }
   return {
       init: function () {
           subscribe(”/mytopic”, this, processMessages);
       }
   };
}();

所以原则很简单: 唯一应该要用到new操作符的地方就是调用一个古老的构造器函数的时候。当调用一个构造器函数的时候,是强制要求使用new的。有时候可以来new一下, 有的时候还是不要了吧。

引用
注 原文:http://www.uiplanet.com/taobao/2007/05/15/%e4%bd%a0%e7%9c%9f%e7%9a%84%e4%bc%9a%e5%86%99javascript%e5%90%97%ef%bc%9f/
可以参考以下文章,英文的:http://msdn.microsoft.com/msdnmag/issues/07/05/JavaScript/default.aspx?loc=en#S6
Javascript 相关文章推荐
javascript中的几个运算符
Jun 29 Javascript
Zero Clipboard js+swf实现的复制功能使用方法
Mar 07 Javascript
读jQuery之七 判断点击了鼠标哪个键的代码
Jun 21 Javascript
jquery乱码与contentType属性设置问题解决方案
Jan 07 Javascript
基于Jquery和CSS3制作数字时钟附源码下载(CSS3篇)
Nov 24 Javascript
jQuery中on绑定事件后引发的事件冒泡问题如何解决
May 25 Javascript
angularJs关于指令的一些冷门属性详解
Oct 24 Javascript
js自定义弹框插件的封装
Aug 24 Javascript
js实现移动端导航点击自动滑动效果
Jul 18 Javascript
vue实现购物车的监听
Apr 20 Javascript
vue-video-player视频播放器使用配置详解
Oct 23 Javascript
微信小程序自定义底部弹出框动画
Nov 18 Javascript
几款极品的javascript压缩混淆工具
May 16 #Javascript
(JS实现)MapBar中坐标的加密和解密的脚本
May 16 #Javascript
网站被黑的假象--ARP欺骗之页面中加入一段js
May 16 #Javascript
javascript操作文本框readOnly
May 15 #Javascript
静态页面下用javascript操作ACCESS数据库(读增改删)的代码
May 14 #Javascript
User Scripts: Video Download by User Scripts
May 14 #Javascript
javascript之卸载鼠标事件的代码
May 14 #Javascript
You might like
php中文乱码怎么办如何让浏览器自动识别utf-8
2014/01/15 PHP
php 判断字符串中是否包含html标签
2014/02/17 PHP
2014年最新推荐的10款 PHP 开发框架
2014/08/01 PHP
JavaScript自定义DateDiff函数(兼容所有浏览器)
2012/03/01 Javascript
Javascript浅谈之this
2013/12/17 Javascript
JavaScript数字和字符串转换示例
2014/03/26 Javascript
jQuery浏览器CSS3特写兼容实例
2015/01/19 Javascript
总结JavaScript设计模式编程中的享元模式使用
2016/05/21 Javascript
web前端开发upload上传头像js示例代码
2016/10/22 Javascript
bootstrap datetimepicker实现秒钟选择下拉框
2017/01/05 Javascript
js基于FileSaver.js 浏览器导出Excel文件的示例
2017/08/15 Javascript
Vue框架TypeScript装饰器使用指南小结
2019/02/18 Javascript
jQuery模拟html下拉多选框的原生实现方法示例
2019/05/30 jQuery
ES6 Iterator接口和for...of循环用法分析
2019/07/31 Javascript
在微信小程序中使用mqtt服务的方法
2019/12/13 Javascript
vue实现购物车的监听
2020/04/20 Javascript
jQuery实现鼠标滑动切换图片
2020/05/27 jQuery
python OpenCV学习笔记之绘制直方图的方法
2018/02/08 Python
树莓派用python中的OpenCV输出USB摄像头画面
2019/06/22 Python
OpenCV 表盘指针自动读数的示例代码
2020/04/10 Python
python处理写入数据代码讲解
2020/10/22 Python
美国大型的健身社区和补充商店:Bodybuilding.com
2016/09/06 全球购物
北京鼎普科技股份有限公司软件测试面试题
2012/04/07 面试题
施工安全协议书
2013/12/11 职场文书
网络优化专员求职信
2014/05/04 职场文书
安全技术说明书
2014/05/09 职场文书
留守儿童工作方案
2014/06/02 职场文书
电子商务求职信
2014/06/15 职场文书
英语课前三分钟演讲稿
2014/08/19 职场文书
公司副总经理岗位职责
2014/10/01 职场文书
党员群众路线剖析材料
2014/10/08 职场文书
个人投资合作协议书
2014/10/12 职场文书
2015年幼儿园新年寄语
2014/12/08 职场文书
导游词之江西赣州
2019/10/15 职场文书
无线电知识基础入门篇
2022/02/18 无线电
Python下载商品数据并连接数据库且保存数据
2022/03/31 Python