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实现动画效果circle实例
Aug 06 Javascript
基于Jquery和html5实现炫酷的3D焦点图动画
Mar 02 Javascript
jQuery实现查找最近父节点的方法
Jun 23 Javascript
浅谈angularJS的$watch失效问题的解决方案
Aug 11 Javascript
Three.js实现浏览器变动时进行自适应的方法
Sep 26 Javascript
微信小程序tabBar用法实例详解
Dec 04 Javascript
详解Puppeteer 入门教程
May 09 Javascript
微信小程序自定义select下拉选项框组件的实现代码
Aug 28 Javascript
Vuex的基本概念、项目搭建以及入坑点
Nov 04 Javascript
最简单的vue消息提示全局组件的方法
Jun 16 Javascript
vue 解决computed修改data数据的问题
Nov 06 Javascript
JavaScript实现动态生成表格
Aug 02 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实现下载断点续传的方法
2014/11/12 PHP
PHP数组相关函数汇总
2015/03/24 PHP
php递归遍历删除文件的方法
2015/04/17 PHP
PHP实现导出带样式的Excel
2016/08/28 PHP
linux平台编译安装PHP7并安装Redis扩展与Swoole扩展实例教程
2016/09/30 PHP
jQuery 渐变下拉菜单
2009/12/15 Javascript
JavaScript String.replace函数参数实例说明
2013/06/06 Javascript
php 中序列化和json使用介绍
2013/07/08 Javascript
jQuery动态创建html元素的常用方法汇总
2014/09/05 Javascript
js数组的基本操作(很全自己整理的)
2014/10/16 Javascript
BootStrap组件之进度条的基本用法
2017/01/19 Javascript
整理关于Bootstrap列表组的慕课笔记
2017/03/29 Javascript
浅谈webpack下的AOP式无侵入注入
2017/11/12 Javascript
为jquery的ajax请求添加超时timeout时间的操作方法
2018/09/04 jQuery
通过实例解析chrome如何在mac环境中安装vue-devtools插件
2020/07/10 Javascript
html+vue.js 实现漂亮分页功能可兼容IE
2020/11/07 Javascript
使用typescript快速开发一个cli的实现示例
2020/12/09 Javascript
python操作日期和时间的方法
2014/03/11 Python
Win7 64位下python3.6.5安装配置图文教程
2020/10/27 Python
不归路系列:Python入门之旅-一定要注意缩进!!!(推荐)
2019/04/16 Python
Python 内置变量和函数的查看及说明介绍
2019/12/25 Python
python和php学习哪个更有发展
2020/06/17 Python
HTML5有哪些新特征
2015/12/01 HTML / CSS
英国领先的亚洲旅游专家:Wendy Wu Tours
2018/01/21 全球购物
应届生体育教师自荐信
2013/10/03 职场文书
教师开学感言
2014/02/14 职场文书
采购助理岗位职责
2014/02/16 职场文书
党员公开承诺事项
2014/03/25 职场文书
党的群众路线教育实践活动个人对照检查材料范文
2014/09/25 职场文书
个人买房协议书范本
2014/10/06 职场文书
感谢信的格式
2015/01/21 职场文书
发票退票证明
2015/06/24 职场文书
反邪教教育心得体会
2016/01/15 职场文书
详解运行Python的神器Jupyter Notebook
2021/06/03 Python
python not运算符的实例用法
2021/06/30 Python
Tomcat starup.bat 脚本实现开机自启动
2022/04/20 Servers