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 相关文章推荐
utf8的编码算法 转载
Dec 27 Javascript
js实现权限树的更新权限时的全选全消功能
Feb 17 Javascript
关于Ext中form移除textfield方法:hide(),setVisible(false),remove()
Dec 02 Javascript
JavaScript中双叹号!!作用示例介绍
Sep 21 Javascript
AngularJS中transclude用法详解
Nov 03 Javascript
jQuery UI插件实现百度提词器效果
Nov 21 Javascript
vue使用ajax获取后台数据进行显示的示例
Aug 09 Javascript
Vue-Router基础学习笔记(小结)
Oct 15 Javascript
浅谈layui使用模板引擎动态渲染元素要注意的问题
Sep 14 Javascript
微信小程序学习总结(一)项目创建与目录结构分析
Jun 04 Javascript
Javascript文本框脚本实现方法解析
Oct 30 Javascript
js实现纯前端压缩图片
Nov 16 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
apache+php+mysql安装配置方法小结
2010/08/01 PHP
javascript数组与php数组的地址传递及值传递用法实例
2015/01/22 PHP
JS 自动安装exe程序
2008/11/30 Javascript
ComboBox 和 DateField 在IE下消失的解决方法
2013/08/30 Javascript
js实现的tab标签切换效果代码分享
2015/08/25 Javascript
JavaScript截取、切割字符串的技巧
2016/01/07 Javascript
js基于FileSaver.js 浏览器导出Excel文件的示例
2017/08/15 Javascript
jQuery实现的粘性滚动导航栏效果实例【附源码下载】
2017/10/19 jQuery
vue.js给动态绑定的radio列表做批量编辑的方法
2018/02/28 Javascript
vue的传参方式汇总和router使用技巧
2018/05/22 Javascript
Vue.js实现数据响应的方法
2018/08/13 Javascript
angularJs提交文本框数据到后台的方法
2018/10/08 Javascript
JavaScript数据结构与算法之二叉树实现查找最小值、最大值、给定值算法示例
2019/03/01 Javascript
如何在JavaScript中优雅的提取循环内数据详解
2019/03/04 Javascript
小程序开发踩坑:页面窗口定位(相对于浏览器定位)(推荐)
2019/04/25 Javascript
微信小程序 swiper 组件遇到的问题及解决方法
2019/05/26 Javascript
详解Vue中CSS样式穿透问题
2019/09/12 Javascript
vuex实现数据状态持久化
2019/11/11 Javascript
使用Python脚本将绝对url替换为相对url的教程
2015/04/24 Python
python黑魔法之编码转换
2016/01/25 Python
彻底搞懂Python字符编码
2018/01/23 Python
安装python时MySQLdb报错的问题描述及解决方法
2018/03/20 Python
pytorch 固定部分参数训练的方法
2019/08/17 Python
Python面向对象之私有属性和私有方法应用案例分析
2019/12/31 Python
详解python tkinter模块安装过程
2020/01/06 Python
python轮询机制控制led实例
2020/05/03 Python
Python reduce函数作用及实例解析
2020/05/08 Python
使用Pycharm在运行过程中,查看每个变量的操作(show variables)
2020/06/08 Python
python开发一款翻译工具
2020/10/10 Python
美国最大的农村生活方式零售店:Tractor Supply Company(TSC)
2017/05/15 全球购物
美国伊甸园兄弟种子公司:Eden Brothers
2018/07/01 全球购物
化学教师自荐信范文
2013/12/28 职场文书
乡镇干部个人对照检查材料(群众路线)
2014/09/26 职场文书
2015元旦晚会主持词(开场白+结束语)
2014/12/14 职场文书
暑期家教宣传单
2015/07/14 职场文书
Java死锁的排查
2022/05/11 Java/Android