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扩展自写的 UI导航
Jan 13 Javascript
javascript动态添加表格数据行(ASP后台数据库保存例子)
May 08 Javascript
jquery控制listbox中项的移动并排序的实现代码
Sep 28 Javascript
xml转json的js代码
Aug 28 Javascript
jQuery中的siblings用法实例分析
Dec 24 Javascript
使用CSS+JavaScript或纯js实现半透明遮罩效果的实例分享
May 09 Javascript
用JS实现轮播图效果(二)
Jun 26 Javascript
js实现上传文件添加和删除文件选择框
Oct 24 Javascript
swiper.js插件实现pc端文本上下滑动功能示例
Dec 03 Javascript
JS实现图片懒加载(lazyload)过程详解
Apr 02 Javascript
vue 单页应用和多页应用的优劣
Oct 22 Javascript
JS代码实现页面切换效果
Jan 10 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 array操作10个小技巧分享
2011/06/23 PHP
php XMLWriter类的简单示例代码(RSS输出)
2011/09/30 PHP
PHP中鲜为人知的10个函数
2014/02/28 PHP
PHP版本常用的排序算法汇总
2015/12/20 PHP
PHP中关于php.ini参数优化详解
2020/02/28 PHP
javascript知识点收藏
2007/02/22 Javascript
(function(){})()的用法与优点
2007/03/11 Javascript
JavaScript 字符串与数组转换函数[不用split与join]
2009/12/13 Javascript
jquery 最简单易用的表单验证插件
2010/02/27 Javascript
javascript 函数参数限制说明
2010/11/19 Javascript
jQuery中offset()方法用法实例
2015/01/16 Javascript
JS中完美兼容各大浏览器的scrolltop方法
2015/04/17 Javascript
JS实现文档加载完成后执行代码
2015/07/09 Javascript
jquery中object对象循环遍历的方法
2015/12/18 Javascript
javascript中利用柯里化函数实现bind方法
2016/04/29 Javascript
jQuery使用siblings获取某元素所有同辈(兄弟姐妹)元素用法示例
2017/01/30 Javascript
详解使用React制作一个模态框
2019/03/14 Javascript
Vue CLI3中使用compass normalize的方法
2019/05/30 Javascript
vue实现日历表格(element-ui)
2020/09/24 Javascript
[40:16]TFT vs Mski Supermajor小组赛C组 BO3 第二场 6.3
2018/06/04 DOTA
Python 执行字符串表达式函数(eval exec execfile)
2014/08/11 Python
python使用post提交数据到远程url的方法
2015/04/29 Python
python去除字符串中的换行符
2017/10/11 Python
Python实现霍夫圆和椭圆变换代码详解
2018/01/12 Python
Python多线程threading和multiprocessing模块实例解析
2018/01/29 Python
python微信跳一跳系列之棋子定位颜色识别
2018/02/26 Python
使用 prometheus python 库编写自定义指标的方法(完整代码)
2020/06/29 Python
利用scikitlearn画ROC曲线实例
2020/07/02 Python
经验丰富程序员才知道的8种高级Python技巧
2020/07/27 Python
墨西哥巴士车票在线购买:ClickBus
2018/03/27 全球购物
军训 自我鉴定
2014/02/03 职场文书
解除劳动合同协议书(样本)
2014/10/02 职场文书
工作证明书
2015/06/15 职场文书
幼儿园见习总结
2015/06/23 职场文书
爱心捐赠活动简讯
2015/07/20 职场文书
vue使用echarts实现折线图
2022/03/21 Vue.js