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 相关文章推荐
初学prototype,发个JS接受URL参数的代码
Sep 25 Javascript
zeroclipboard复制到剪切板的flash
Aug 04 Javascript
在服务端(Page.Write)调用自定义的JS方法详解
Aug 09 Javascript
jQuery选择器全面总结
Jan 06 Javascript
JS自调用匿名函数具体实现
Feb 11 Javascript
JavaScript prototype属性详解
Oct 25 Javascript
使用vue实现点击按钮滑出面板的实现代码
Jan 10 Javascript
JavaScript中值类型和引用类型的区别
Feb 23 Javascript
jQuery中用on绑定事件时需注意的事项
Mar 19 Javascript
Ionic + Angular.js实现验证码倒计时功能的方法
Jun 12 Javascript
深入浅析javascript继承体系
Oct 23 Javascript
JS实现关键词高亮显示正则匹配
Jun 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
PHP概述.
2006/10/09 PHP
基于php冒泡排序算法的深入理解
2013/06/09 PHP
列举PHP的Yii 2框架的开发优势
2015/07/03 PHP
PHP解压tar.gz格式文件的方法
2016/02/14 PHP
PHP数组函数知识汇总
2016/05/12 PHP
php实现的rc4加密解密类定义与用法示例
2018/08/16 PHP
ExtJS PropertyGrid中使用Combobox选择值问题
2010/06/13 Javascript
jquery 全局AJAX事件使用代码
2010/11/05 Javascript
轻松实现javascript数据双向绑定
2015/11/11 Javascript
javascript中eval和with用法实例总结
2015/11/30 Javascript
最细致的vue.js基础语法 值得收藏!
2016/11/03 Javascript
深入理解 JavaScript 中的 JSON
2017/04/06 Javascript
解决ztree搜索中多级菜单展示不全问题
2017/07/05 Javascript
Thinkphp5微信小程序获取用户信息接口的实例详解
2017/09/26 Javascript
vue.js系列中的vue-fontawesome使用
2018/02/10 Javascript
Node配合WebSocket做多文件下载以及进度回传
2019/11/07 Javascript
element el-tree组件的动态加载、新增、更新节点的实现
2020/02/27 Javascript
星球大战与Python之间的那些事
2016/01/07 Python
实例讲解Python中global语句下全局变量的值的修改
2016/06/16 Python
Python简单实现安全开关文件的两种方式
2016/09/19 Python
Python 实现字符串中指定位置插入一个字符
2018/05/02 Python
Python 操作mysql数据库查询之fetchone(), fetchmany(), fetchall()用法示例
2019/10/17 Python
Python递归实现打印多重列表代码
2020/02/27 Python
自定义Django_rest_framework_jwt登陆错误返回的解决
2020/10/18 Python
Sperry澳大利亚官网:源自美国帆船鞋创始品牌
2019/07/29 全球购物
智能钱包:Ekster
2019/11/21 全球购物
EJB面试题
2015/07/28 面试题
艺术设计专业求职自荐信
2014/05/19 职场文书
高等教育学专业自荐书
2014/06/17 职场文书
电子银行业务授权委托书
2014/10/10 职场文书
药房管理制度范本
2015/08/06 职场文书
goland 设置project gopath的操作
2021/05/06 Golang
新手必备Python开发环境搭建教程
2021/05/28 Python
MySQL 不等于的三种使用及区别
2021/06/03 MySQL
Redis入门教程详解
2021/08/30 Redis
Win10服务全部禁用了怎么启动?Win10服务全部禁用解决方法
2022/09/23 数码科技