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 相关文章推荐
会自动逐行上升的文本框
Jun 30 Javascript
个人总结的一些关于String、Function、Array的属性和用法
Jan 10 Javascript
window.open以post方式将内容提交到新窗口
Dec 26 Javascript
TypeError document.getElementById(...) is null错误原因
May 18 Javascript
jQuery多文件异步上传带进度条实例代码
Aug 16 Javascript
浅谈JS中的!=、== 、!==、===的用法和区别
Sep 24 Javascript
基于Vue.js实现简单搜索框
Mar 26 Javascript
浅谈JavaScript的自动垃圾收集机制
Dec 15 Javascript
Angular 输入框实现自定义验证功能
Feb 19 Javascript
vue拖拽排序插件vuedraggable使用方法详解
Aug 21 Javascript
Vue 实现登录界面验证码功能
Jan 03 Javascript
如何优雅地取消 JavaScript 异步任务
Mar 22 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
第十二节--类的自动加载
2006/11/16 PHP
PHP Ajax中文乱码问题解决方法
2009/02/27 PHP
JS与PHP向函数传递可变参数的区别实例代码
2011/05/18 PHP
php curl选项列表(超详细)
2013/07/01 PHP
memcache一致性hash的php实现方法
2015/03/05 PHP
php限制文件下载速度的代码
2015/10/20 PHP
浅析PHP开发规范
2018/02/05 PHP
PHP实现分布式memcache设置web集群session同步的方法
2018/04/10 PHP
js控制不同的时间段显示不同的css样式的实例代码
2013/11/04 Javascript
jquery实现的鼠标下拉滚动置顶效果
2014/07/24 Javascript
JS实现表单中checkbox对勾选中增加边框显示效果
2015/08/21 Javascript
JavaScript中this详解
2015/09/01 Javascript
AngularJS教程之MVC体系结构详解
2016/08/16 Javascript
基于JS实现类似支付宝支付密码输入框
2016/09/02 Javascript
jquery动态添加文本并获取值的方法
2016/10/12 Javascript
socket.io学习教程之深入学习篇(三)
2017/04/29 Javascript
jQuery判断网页是否已经滚动到浏览器底部的实现方法
2017/10/27 jQuery
Vue.js中的computed工作原理
2018/03/22 Javascript
vue异步加载高德地图的实现
2018/06/19 Javascript
JS解析后台返回的JSON格式数据实例
2018/08/06 Javascript
Vue Echarts实现可视化世界地图代码实例
2019/05/07 Javascript
Node.js HTTP服务器中的文件、图片上传的方法
2019/09/23 Javascript
python批量提取word内信息
2015/08/09 Python
Python及PyCharm下载与安装教程
2017/11/18 Python
python dlib人脸识别代码实例
2019/04/04 Python
Python实现蒙特卡洛算法小实验过程详解
2019/07/12 Python
Flask框架请求钩子与request请求对象用法实例分析
2019/11/07 Python
Python 给下载文件显示进度条和下载时间的实现
2020/04/02 Python
python3:excel操作之读取数据并返回字典 + 写入的案例
2020/09/01 Python
大学生简历求职信
2014/06/24 职场文书
迟到检讨书
2015/01/26 职场文书
学校计划生育责任书
2015/05/09 职场文书
selenium.webdriver中add_argument方法常用参数表
2021/04/08 Python
Python利用机器学习算法实现垃圾邮件的识别
2021/06/28 Python
聊聊Python String型列表求最值的问题
2022/01/18 Python
windows安装 redis 6.2.6最新步骤详解
2022/04/26 Redis