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 相关文章推荐
一份老外写的XMLHttpRequest代码多浏览器支持兼容性
Jan 11 Javascript
jQuery javaScript捕获回车事件(示例代码)
Nov 07 Javascript
javascript中checkbox使用方法实例演示
Nov 19 Javascript
JavaScript中Function函数与Object对象的关系
Dec 17 Javascript
JS使用正则表达式实现关键字替换加粗功能示例
Aug 03 Javascript
angularJs-$http实现百度搜索时的动态下拉框示例
Feb 27 Javascript
Vue slot用法(小结)
Oct 22 Javascript
微信小程序中如何计算距离某个节日还有多少天
Jul 15 Javascript
VScode格式化ESlint方法(最全最好用方法)
Sep 10 Javascript
微信小程序地图实现展示线路
Jul 29 Javascript
Vue实现简单购物车功能
Dec 13 Vue.js
vue 给数组添加新对象并赋值
Apr 20 Vue.js
几款极品的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 读取shell管道传输过来的内容
2010/03/01 PHP
php计算数组不为空元素个数的方法
2014/01/27 PHP
set_exception_handler函数在ThinkPHP中的用法
2014/10/31 PHP
[原创]PHP实现字节数Byte转换为KB、MB、GB、TB的方法
2017/08/31 PHP
php/JS实现的生成随机密码(验证码)功能示例
2019/06/06 PHP
php过滤htmlspecialchars() 函数实现把预定义的字符转换为 HTML 实体用法分析
2019/06/25 PHP
最新28个很棒的jQuery 教程
2011/05/28 Javascript
动态的创建一个元素createElement及删除一个元素
2014/01/24 Javascript
javascript中传统事件与现代事件
2015/06/23 Javascript
举例讲解jQuery对DOM元素的向上遍历、向下遍历和水平遍历
2016/07/07 Javascript
浅析script标签中的defer与async属性
2016/11/30 Javascript
jQuery实现倒计时重新发送短信验证码功能示例
2017/01/12 Javascript
微信小程序 跳转传递数据的实例
2017/07/06 Javascript
js最简单的双向绑定实例讲解
2018/01/02 Javascript
jQuery+css last-child实现选择最后一个子元素操作示例
2018/12/10 jQuery
layui之数据表格--与后台交互获取数据的方法
2019/09/29 Javascript
Vue实现base64编码图片间的切换功能
2019/12/04 Javascript
JS实现简单日历特效
2020/01/03 Javascript
JS画布动态实现黑客帝国背景效果
2020/11/08 Javascript
原生JS实现京东查看商品点击放大
2020/12/21 Javascript
[13:56]DAC2018 4.5SOLO赛决赛 MidOne vs Paparazi第一场
2018/04/06 DOTA
[41:11]完美世界DOTA2联赛PWL S2 Inki vs Magma 第一场 11.22
2020/11/24 DOTA
Sanic框架路由用法实例分析
2018/07/16 Python
Python图像滤波处理操作示例【基于ImageFilter类】
2019/01/03 Python
利用pyshp包给shapefile文件添加字段的实例
2019/12/06 Python
Python 中如何实现参数化测试的方法示例
2019/12/10 Python
最好的商品表达自己:Cafepress
2019/09/04 全球购物
印度手工编织服装和家居用品商店:Fabindi
2019/10/07 全球购物
Java语言程序设计测试题改错题部分
2014/07/22 面试题
国际金融专业大学生职业生涯规划书
2013/12/28 职场文书
致垒球运动员加油稿
2014/02/16 职场文书
旅游管理专业大学生职业规划书
2014/02/27 职场文书
员工薪酬激励方案
2014/06/13 职场文书
党的群众路线教育实践活动领导班子整改方案
2014/10/25 职场文书
新郎结婚保证书
2015/02/26 职场文书
React + Threejs + Swiper 实现全景图效果的完整代码
2021/06/28 Javascript