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 相关文章推荐
一些有关检查数据的JS代码
Sep 07 Javascript
使用jQuery判断IE浏览器版本的代码
Jun 14 Javascript
值得分享的Bootstrap Ace模板实现菜单和Tab页效果
Dec 30 Javascript
JavaScript事件详细讲解
Jun 27 Javascript
JS点击某个图标或按钮弹出文件选择框的实现代码
Sep 27 Javascript
简单实现AngularJS轮播图效果
Apr 10 Javascript
Vue实现双向数据绑定
May 03 Javascript
vue-quill-editor实现图片上传功能
Aug 08 Javascript
vue中遇到的坑之变化检测问题(数组相关)
Oct 13 Javascript
Vue.directive 自定义指令的问题小结
Mar 04 Javascript
vue中父子组件注意事项,传值及slot应用技巧
May 09 Javascript
vue addRoutes实现动态权限路由菜单的示例
May 15 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
「OVERLORD」动画重要删减!雅儿贝德的背叛?至尊猎杀队结成
2020/04/09 日漫
色色整理的PHP面试题集锦
2012/03/08 PHP
解析二进制流接口应用实例 pack、unpack、ord 函数使用方法
2013/06/18 PHP
Alliance vs Liquid BO3 第一场2.13
2021/03/10 DOTA
javascript中的注释使用与注意事项小结
2011/09/20 Javascript
批量实现面向对象的实例代码
2013/07/01 Javascript
js改变img标签的src属性在IE下没反应的解决方法
2013/07/23 Javascript
纯js分页代码(简洁实用)
2013/11/05 Javascript
jquery无刷新验证邮箱地址实现实例
2014/02/19 Javascript
让javascript加载速度倍增的方法(解决JS加载速度慢的问题)
2014/12/12 Javascript
Angularjs中的事件广播 —全面解析$broadcast,$emit,$on
2016/05/17 Javascript
30分钟快速掌握Bootstrap框架
2016/05/24 Javascript
微信小程序 tabs选项卡效果的实现
2017/01/05 Javascript
JavaScript去掉数组重复项的方法分析【测试可用】
2018/07/19 Javascript
vue单页面应用打开新窗口显示跳转页面的实例
2018/09/21 Javascript
详解服务端预渲染之Nuxt(介绍篇)
2019/04/07 Javascript
vue读取本地的excel文件并显示在网页上方法示例
2019/05/29 Javascript
使用js在layui中实现上传图片压缩
2019/06/18 Javascript
VUE:vuex 用户登录信息的数据写入与获取方式
2019/11/11 Javascript
JavaScript如何实现图片处理与合成
2020/05/29 Javascript
[57:37]EG vs Mineski 2018国际邀请赛小组赛BO2 第二场 8.16
2018/08/17 DOTA
python中使用print输出中文的方法
2018/07/16 Python
python 自动重连wifi windows的方法
2018/12/18 Python
详解从Django Rest Framework响应中删除空字段
2019/01/11 Python
python使用requests模块实现爬取电影天堂最新电影信息
2019/04/03 Python
Django自带日志 settings.py文件配置方法
2019/08/30 Python
详解python中的lambda与sorted函数
2020/09/04 Python
python利用appium实现手机APP自动化的示例
2021/01/26 Python
Nike西班牙官方网站:Nike.com (ES)
2017/10/30 全球购物
思想品德自我鉴定
2013/10/12 职场文书
护士见习期自我鉴定
2014/02/08 职场文书
《花木兰》教学反思
2014/04/09 职场文书
超市开业庆典策划方案
2014/05/14 职场文书
2014年留守儿童工作总结
2014/12/10 职场文书
原料仓管员岗位职责
2015/04/01 职场文书
【海涛解说】pis亲自推荐,其实你从来不会玩NW
2022/04/01 DOTA