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中通过过滤器获取表单元素的实现代码
Jul 05 Javascript
UI Events 用户界面事件
Jun 27 Javascript
Extjs显示从数据库取出时间转换JSON后的出现问题
Nov 20 Javascript
正则表达式搭配js轻松处理json文本方便而老古
Feb 17 Javascript
全面了解javascript中的错误处理机制
Jul 18 Javascript
使用jQuery的ajax方法向服务器发出get和post请求的方法
Jan 13 Javascript
Node.js 异步异常的处理与domain模块解析
May 10 Javascript
jQuery插件imgAreaSelect基础讲解
May 26 jQuery
JavaScript正则表达式的贪婪匹配和非贪婪匹配
Sep 05 Javascript
javascript中关于类型判断的一些疑惑小结
Oct 14 Javascript
js纯前端实现腾讯cos文件上传功能的示例代码
May 14 Javascript
vue 父组件通过$refs获取子组件的值和方法详解
Nov 07 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中执行系统外部命令
2006/10/09 PHP
PHP has encountered an Access Violation at 7C94BD02解决方法
2009/08/24 PHP
php中$_GET与$_POST过滤sql注入的方法
2014/11/03 PHP
linux中cd命令使用详解
2015/01/08 PHP
js正则表达exec与match的区别说明
2014/01/29 Javascript
一个简单的动态加载js和css的jquery代码
2014/09/01 Javascript
NodeJS Web应用监听sock文件实例
2015/02/18 NodeJs
nodejs中实现阻塞实例
2015/03/24 NodeJs
JavaScript中调用函数的4种方式代码实例
2015/07/08 Javascript
javascript数组随机排序实例分析
2015/07/22 Javascript
jQuery中常用的遍历函数用法实例总结
2015/09/01 Javascript
IOS中safari下的select下拉菜单文字过长不换行的解决方法
2016/09/26 Javascript
php 修改密码实现代码
2017/05/24 Javascript
Node.js 基础教程之全局对象
2017/08/06 Javascript
详解关于Vue版本不匹配问题(Vue packages version mismatch)
2018/09/17 Javascript
使用vue完成微信公众号网页小记(推荐)
2019/04/28 Javascript
jQuery实现穿梭框效果
2021/01/19 jQuery
Python中使用第三方库xlutils来追加写入Excel文件示例
2015/04/05 Python
Python爬虫模拟登录带验证码网站
2016/01/22 Python
virtualenv实现多个版本Python共存
2017/08/21 Python
PyQt弹出式对话框的常用方法及标准按钮类型
2019/02/27 Python
使用pyhon绘图比较两个手机屏幕大小(实例代码)
2020/01/03 Python
Python定时任务APScheduler安装及使用解析
2020/08/07 Python
如何使用python socket模块实现简单的文件下载
2020/09/04 Python
python两种注释用法的示例
2020/10/09 Python
AmazeUI 网格的实现示例
2020/08/13 HTML / CSS
总监职责范文
2013/11/09 职场文书
法人授权委托书
2014/04/03 职场文书
广播体操比赛口号
2014/06/10 职场文书
建筑结构施工求职信
2014/07/11 职场文书
民族团结演讲稿范文
2014/08/27 职场文书
专业见习报告范文
2014/11/03 职场文书
专职安全员岗位职责
2015/04/11 职场文书
指导教师推荐意见
2015/06/05 职场文书
大学生安全教育主题班会
2015/08/12 职场文书
2015年秋学期师德师风建设工作总结
2015/10/23 职场文书