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 相关文章推荐
JavaScript 基础知识 被自己遗忘的
Oct 15 Javascript
jQuery帮助之CSS尺寸(五)outerHeight、outerWidth
Nov 14 Javascript
jQuery后代选择器用法实例
Dec 23 Javascript
微信小程序 网络API Websocket详解
Nov 09 Javascript
详解数组Array.sort()排序的方法
May 09 Javascript
JS实现移动端实时监听输入框变化的实例代码
Apr 12 Javascript
JS数组操作之增删改查的简单实现
Aug 21 Javascript
深入浅析Vue.js 中的 v-for 列表渲染指令
Nov 19 Javascript
解决Vue 给mapState中定义的属性赋值报错的问题
Jun 22 Javascript
实现vuex原理的示例
Oct 21 Javascript
uniapp实现可滑动选项卡
Oct 21 Javascript
详解如何在Canvas中添加事件的方法
Apr 17 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 动态随机生成验证码类代码
2010/04/09 PHP
利用PHP实现图片等比例放大和缩小的方法详解
2013/06/06 PHP
php传值方式和ajax的验证功能
2017/03/27 PHP
php微信开发之音乐回复功能
2018/06/14 PHP
PHP面向对象类型约束用法分析
2019/06/12 PHP
jquery.validate使用攻略 第一部
2010/07/01 Javascript
JavaScript中变量提升 Hoisting
2012/07/03 Javascript
IE与FireFox的JavaScript兼容问题解决办法
2013/12/31 Javascript
js使用正则实现ReplaceAll全部替换的方法
2014/08/22 Javascript
深入理解JavaScript系列(18):面向对象编程之ECMAScript实现
2015/03/05 Javascript
javascript实现超炫的向上滑行菜单实例
2015/08/03 Javascript
根据user-agent判断蜘蛛代码黑帽跳转代码(js版与php版本)
2015/09/14 Javascript
最棒的Angular2表格控件
2016/08/10 Javascript
AngularJS中transclude用法详解
2016/11/03 Javascript
基于JavaScript实现带缩略图的轮播效果
2017/01/12 Javascript
js的OOP继承实现(必看篇)
2017/02/18 Javascript
vue-router:嵌套路由的使用方法
2017/02/21 Javascript
JS闭包可被利用的常见场景小结
2017/04/09 Javascript
Vue通过input筛选数据
2020/10/26 Javascript
Vue-Router模式和钩子的用法
2018/02/28 Javascript
详解html-webpack-plugin插件(用法总结)
2018/09/12 Javascript
nodejs中express入门和基础知识点学习
2018/09/13 NodeJs
vue简单封装axios插件和接口的统一管理操作示例
2020/02/02 Javascript
JavaScript实现飞舞的泡泡效果
2020/02/07 Javascript
Python数据类型学习笔记
2016/01/13 Python
python更改已存在excel文件的方法
2018/05/03 Python
python读取文本绘制动态速度曲线
2018/06/21 Python
Java Spring项目国际化(i18n)详细方法与实例
2020/03/20 Python
详解pyinstaller生成exe的闪退问题解决方案
2020/06/19 Python
Tostadora意大利:定制T恤
2019/04/08 全球购物
事业单位鉴定材料
2014/05/25 职场文书
保护环境建议书作文500字
2015/09/14 职场文书
2016民族团结先进个人事迹材料
2016/02/26 职场文书
python 判断文件或文件夹是否存在
2022/03/18 Python
详解Mysql事务并发(脏读、不可重复读、幻读)
2022/04/29 MySQL
Mybatis-plus配置分页插件返回统一结果集
2022/06/21 Java/Android