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 JSON操作入门实例
Apr 16 Javascript
Javascript数组的排序 sort()方法和reverse()方法
Jun 04 Javascript
减少访问DOM的次数提升javascript性能
Feb 24 Javascript
使用原生js写的一个简单slider
Apr 29 Javascript
Javascript的闭包详解
Dec 26 Javascript
javascript实现百度地图鼠标滑动事件显示、隐藏
Apr 02 Javascript
JavaScript实现下拉列表框数据增加、删除、上下排序的方法
Aug 11 Javascript
Javascript将数值转换为金额格式(分隔千分位和自动增加小数点)
Jun 22 Javascript
jQuery自制提示框tooltip改进版
Aug 01 Javascript
Ajax的概述与实现过程
Nov 18 Javascript
vue自定义指令的创建和使用方法实例分析
Dec 04 Javascript
jquery绑定事件 bind和on的用法与区别分析
May 22 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
全国FM电台频率大全 - 21 海南省
2020/03/11 无线电
php array_search() 函数使用
2010/04/13 PHP
Yii使用find findAll查找出指定字段的实现方法
2014/09/05 PHP
PHP正则替换函数preg_replace和preg_replace_callback使用总结
2014/09/22 PHP
Yii基于数组和对象的Model查询技巧实例详解
2015/12/28 PHP
JCalendar 日历控件 v1.0 beta[兼容IE&Firefox] 有文档和例子
2007/05/30 Javascript
jQuery 加上最后自己的验证
2009/11/04 Javascript
扩展javascript的Date方法实现代码(prototype)
2010/11/20 Javascript
腾讯UED 漂亮的提示信息效果代码
2011/09/12 Javascript
巧用js提交表单轻松解决一个页面有多个提交按钮
2013/11/17 Javascript
jQuery根据ID获取input、checkbox、radio、select的示例
2014/08/11 Javascript
javascript跨域原因以及解决方案分享
2015/04/08 Javascript
使用AngularJS对路由进行安全性处理的方法
2015/06/18 Javascript
浅谈javascript函数式编程
2015/09/06 Javascript
javascript省市区三级联动下拉框菜单实例演示
2015/11/29 Javascript
使用jQuery处理AJAX请求的基础学习教程
2016/05/10 Javascript
Angular利用trackBy提升性能的方法
2018/01/26 Javascript
微信小程序排坑指南详解
2018/05/23 Javascript
加快Vue项目的开发速度的方法
2018/12/12 Javascript
js实现的在本地预览图片功能示例
2019/11/09 Javascript
js基于canvas实现时钟组件
2021/02/07 Javascript
python 返回一个列表中第二大的数方法
2019/07/09 Python
详解如何在cmd命令窗口中搭建简单的python开发环境
2019/08/29 Python
Django实现WebSSH操作物理机或虚拟机的方法
2019/11/06 Python
Pytest框架之fixture的详细使用教程
2020/04/07 Python
Xadmin+rules实现多选行权限方式(级联效果)
2020/04/07 Python
秘书行业自我鉴定范文
2013/12/30 职场文书
CAD制图人员的自荐信
2014/02/07 职场文书
法人委托书范本
2014/04/04 职场文书
医院标语大全
2014/06/23 职场文书
中学教师暑期培训方案
2014/08/27 职场文书
2014年机关作风建设工作总结
2014/10/23 职场文书
《梅花魂》教学反思
2016/02/18 职场文书
手把手教你制定暑期学习计划,让你度过充实的暑假
2019/08/22 职场文书
python - timeit 时间模块
2021/04/06 Python
python3使用diagrams绘制架构图的步骤
2021/04/08 Python