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 相关文章推荐
修改jQuery Validation里默认的验证方法
Feb 14 Javascript
setInterval,setTimeout与jquery混用的问题
Apr 08 Javascript
jquery $.each 和for怎么跳出循环终止本次循环
Sep 27 Javascript
纯Javascript实现Windows 8 Metro风格实现
Oct 15 Javascript
浅析return false的正确使用
Nov 04 Javascript
Bootstrap每天必学之附加导航(Affix)插件
Apr 25 Javascript
ThinkJS中如何使用MongoDB的CURD操作
Dec 13 Javascript
微信小程序基于本地缓存实现点赞功能的方法
Dec 18 Javascript
electron-vue开发环境内存泄漏问题汇总
Oct 10 Javascript
VUE+elementui组件在table-cell单元格中绘制微型echarts图
Apr 20 Javascript
利用原生JS实现欢乐水果机小游戏
Apr 23 Javascript
html5以及jQuery实现本地图片上传前的预览代码实例讲解
Mar 01 jQuery
几款极品的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
在WAMP环境下搭建ZendDebugger php调试工具的方法
2011/07/18 PHP
php中print(),print_r(),echo()的区别详解
2014/12/01 PHP
使用php转义输出HTML到JavaScript
2015/03/27 PHP
Discuz!X中SESSION机制实例详解
2015/09/23 PHP
PHP设计模式(六)桥连模式Bridge实例详解【结构型】
2020/05/02 PHP
匹配任意字符的正则表达式写法
2010/04/29 Javascript
ajax 同步请求和异步请求的差异分析
2011/07/04 Javascript
JS字符串函数扩展代码
2011/09/13 Javascript
基于jQuery选择器的整理集合
2013/04/26 Javascript
JS动态添加Table的TR,TD实现方法
2015/01/28 Javascript
javascript实现当前页导航激活的方法
2015/02/27 Javascript
gameboy网页闯关游戏(riddle webgame)--仿微信聊天的前端页面设计和难点
2016/02/21 Javascript
jQuery实用密码强度检测
2017/03/02 Javascript
基于JS对象创建常用方式及原理分析
2017/06/28 Javascript
Vue代码分割懒加载的实现方法
2017/11/23 Javascript
javaScript和jQuery自动加载简单代码实现方法
2017/11/24 jQuery
详解js获取video任意时间的画面截图
2019/04/17 Javascript
[01:07:17]EG vs Optic Supermajor 败者组 BO3 第一场 6.6
2018/06/07 DOTA
如何解决django配置settings时遇到Could not import settings 'conf.local'
2014/11/18 Python
解决python升级引起的pip执行错误的问题
2018/06/12 Python
Anaconda下配置python+opencv+contribx的实例讲解
2018/08/06 Python
详解python while 函数及while和for的区别
2018/09/07 Python
python如果快速判断数字奇数偶数
2019/11/13 Python
python使用协程实现并发操作的方法详解
2019/12/27 Python
Python3 ID3决策树判断申请贷款是否成功的实现代码
2020/05/21 Python
简单介绍HTML5中的文件导入
2015/05/08 HTML / CSS
英国最大的宠物食品和宠物用品网上零售商: Zooplus
2016/08/01 全球购物
加拿大休闲和工业服装和鞋类零售商:L’Équipeur
2018/01/12 全球购物
自1926年以来就为冰岛保持温暖:66°North
2020/11/27 全球购物
国培教师自我鉴定
2014/02/12 职场文书
贪污受贿检讨书范文
2014/11/19 职场文书
乡镇科协工作总结2015
2015/05/19 职场文书
生日宴会祝酒词
2015/08/10 职场文书
2019年市场部个人述职报告(三篇)
2019/10/23 职场文书
vue+spring boot实现校验码功能
2021/05/27 Vue.js
Mysql 文件配置解析介绍
2022/05/06 MySQL