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 缩图函数 (onDOMLoaded)……
Oct 23 Javascript
W3C Group的JavaScript1.8 新特性介绍
May 19 Javascript
node.js中的buffer.toString方法使用说明
Dec 14 Javascript
JS面向对象编程详解
Mar 06 Javascript
jQuery+CSS实现简单切换菜单示例
Jul 27 Javascript
vue购物车插件编写代码
Nov 27 Javascript
JS/HTML5游戏常用算法之碰撞检测 地图格子算法实例详解
Dec 12 Javascript
vue+element项目中过滤输入框特殊字符小结
Aug 07 Javascript
原生javascript中this几种常见用法总结
Feb 24 Javascript
加速vue组件渲染之性能优化
Apr 09 Javascript
vue keep-alive实现多组件嵌套中个别组件存活不销毁的操作
Oct 30 Javascript
在JavaScript中如何使用宏详解
May 06 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 程式大小
2006/12/06 PHP
php 自写函数代码 获取关键字 去超链接
2010/02/08 PHP
memcache命令启动参数中文解释
2014/01/13 PHP
深入探究PHP的多进程编程方法
2015/08/18 PHP
PHP中trait使用方法详细介绍
2017/05/21 PHP
php array_map()函数实例用法
2021/03/03 PHP
利用ASP发送和接收XML数据的处理方法与代码
2007/11/13 Javascript
解决遍历时Array.indexOf产生的性能问题
2012/07/03 Javascript
javascript 获取iframe里页面中元素值的方法
2014/02/17 Javascript
href下载文件根据id取url并下载
2014/05/28 Javascript
轻松学习jQuery插件EasyUI EasyUI创建CRUD应用
2015/11/30 Javascript
jQuery拖拽排序插件制作拖拽排序效果(附源码下载)
2016/02/23 Javascript
js日期插件dateHelp获取本月、三个月、今年的日期
2016/03/07 Javascript
第一次接触神奇的Bootstrap表单
2016/07/27 Javascript
jsp 自动编译机制详细介绍
2016/12/01 Javascript
JavaScript实现经典排序算法之插入排序
2016/12/28 Javascript
jQuery使用DataTable实现删除数据后重新加载功能
2017/02/27 Javascript
JavaScript生成指定范围随机数和随机序列的方法
2018/05/05 Javascript
jQuery实现合并表格单元格中相同行操作示例
2019/01/28 jQuery
vue实现按需加载组件及异步组件功能
2019/05/27 Javascript
在layui中select更改后生效的方法
2019/09/05 Javascript
vue调用本地摄像头实现拍照功能
2020/08/14 Javascript
python实现绘制树枝简单示例
2014/07/24 Python
python使用多线程不断刷新网页的方法
2015/03/31 Python
Python利用multiprocessing实现最简单的分布式作业调度系统实例
2017/11/14 Python
在Python 中实现图片加框和加字的方法
2019/01/26 Python
Tensorflow实现将标签变为one-hot形式
2020/05/22 Python
html5模拟平抛运动(模拟小球平抛运动过程)
2013/07/25 HTML / CSS
HTML5在线预览PDF的示例代码
2017/09/14 HTML / CSS
大学生自荐书范文
2013/12/10 职场文书
班组长安全职责
2014/01/05 职场文书
市场营销工作计划书
2014/05/06 职场文书
中专生自荐信
2014/06/25 职场文书
大学社团活动总结怎么写
2019/06/21 职场文书
解析mybatis-plus中的resultMap简单使用
2021/11/23 Java/Android
蓝牙耳机怎么连接电脑win11? Win11蓝牙耳机连接电脑的技巧
2023/01/09 数码科技