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 相关文章推荐
FLASH 广告之外的链接
Dec 16 Javascript
jQuery 数据缓存data(name, value)详解及实现
Jan 04 Javascript
自定义jQuery选项卡插件实例
Mar 27 Javascript
jQuery操作元素css样式的三种方法
Jun 04 Javascript
教你如何使用node.js制作代理服务器
Nov 26 Javascript
JavaScript 2048 游戏实例代码(简单易懂)
Mar 25 Javascript
JavaScript中ES6 Babel正确安装过程
Jul 18 Javascript
vue.js实现请求数据的方法示例
Feb 07 Javascript
vue.js异步上传文件前后端实现代码
Aug 22 Javascript
基于VUE实现的九宫格抽奖功能
Sep 30 Javascript
前端面试知识点目录一览
Apr 15 Javascript
javascript贪吃蛇游戏设计与实现
Sep 17 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脚本的10个技巧(7)
2006/10/09 PHP
PHP入门学习的几个不错的实例代码
2008/07/13 PHP
PHP中用hash实现的数组
2011/07/17 PHP
PHP函数preg_match_all正则表达式的基本使用详细解析
2013/08/31 PHP
thinkphp实现数组分页示例
2014/04/13 PHP
用js实现的检测浏览器和系统的函数
2009/04/09 Javascript
Prototype Function对象 学习
2009/07/12 Javascript
Firefox下提示illegal character并出现乱码的原因
2010/03/25 Javascript
使用Java实现简单的server/client回显功能的方法介绍
2013/05/03 Javascript
jquery实现的随机多彩tag标签随机颜色和字号大小效果
2014/03/27 Javascript
Bootstrap 附加导航(Affix)插件实例详解
2016/06/01 Javascript
jQuery电话号码验证实例
2017/01/05 Javascript
完美解决UI-Grid表格元素中多个空格显示为一个空格的问题
2017/04/25 Javascript
Vue2 配置 Axios api 接口调用文件的方法
2017/11/13 Javascript
vue.js element-ui validate中代码不执行问题解决方法
2017/12/18 Javascript
分享ES6的7个实用技巧
2018/01/18 Javascript
详解在React.js中使用PureComponent的重要性和使用方式
2018/07/10 Javascript
JS实现简单的文字无缝上下滚动功能示例
2019/06/22 Javascript
JavaScript中条件语句的优化技巧总结
2020/12/04 Javascript
[41:52]2018DOTA2亚洲邀请赛3月29日小组赛B组Effect VS Secret
2018/03/30 DOTA
python中将阿拉伯数字转换成中文的实现代码
2011/05/19 Python
python中正则的使用指南
2016/12/04 Python
Python读取Json字典写入Excel表格的方法
2018/01/03 Python
Python 字符串与数字输出方法
2018/07/16 Python
Python Django框架实现应用添加logging日志操作示例
2019/05/17 Python
树莓派用python中的OpenCV输出USB摄像头画面
2019/06/22 Python
社区版pycharm创建django项目的方法(pycharm的newproject左侧没有项目选项)
2020/09/23 Python
python xlsxwriter模块的使用
2020/12/24 Python
matplotlib 使用 plt.savefig() 输出图片去除旁边的空白区域
2021/01/05 Python
Omio英国:搜索并比较便宜的巴士、火车和飞机
2019/08/27 全球购物
咖啡书吧创业计划书
2014/01/13 职场文书
护士求职自荐信范文
2014/03/19 职场文书
绿色出行口号
2014/06/18 职场文书
2016公司年会通知范文
2015/04/25 职场文书
理解深度学习之深度学习简介
2021/04/14 Python
Win7/8.1用户可以免费升级到Windows 11系统吗?
2021/11/21 数码科技