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基础的动画教程,直观易懂
Jan 10 Javascript
浅谈javascript的原型继承
Jul 25 Javascript
原生js写的放大镜效果
Aug 22 Javascript
淘宝网提供的国内NPM镜像简介和使用方法
Apr 17 Javascript
jQuery实现的原图对比窗帘效果
Jun 15 Javascript
js 实现的可折叠留言板(附源码下载)
Jul 01 Javascript
Javascript 赋值机制详解
Nov 23 Javascript
jQuery中children()方法用法实例
Jan 07 Javascript
JavaScript的事件代理和委托实例分析
Mar 25 Javascript
图文讲解用vue-cli脚手架创建vue项目步骤
Feb 12 Javascript
Node.js中Koa2在控制台输出请求日志的方法示例
May 02 Javascript
vue实现五子棋游戏
May 28 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版(2)
2006/10/09 PHP
Symfony2框架创建项目与模板设置实例详解
2016/03/17 PHP
JavaScript表单常用验证集合
2008/01/16 Javascript
Jquery 弹出层插件实现代码
2009/10/24 Javascript
Jquery作者John Resig自己封装的javascript 常用函数
2009/11/09 Javascript
Jquery Ajax学习实例3 向WebService发出请求,调用方法返回数据
2010/03/16 Javascript
基于Jquery的表格隔行换色,移动换色,点击换色插件
2010/12/22 Javascript
jQuery版仿Path菜单效果
2011/12/15 Javascript
jQuery获取动态生成的元素示例
2014/06/15 Javascript
javascript自动生成包含数字与字符的随机字符串
2015/02/09 Javascript
js使用post 方式打开新窗口
2015/02/26 Javascript
JavaScript实现删除,移动和复制文件的方法
2015/08/05 Javascript
JS实现弹出浮动窗口(支持鼠标拖动和关闭)实例详解
2015/08/06 Javascript
JS+CSS相对定位实现的下拉菜单
2015/10/06 Javascript
快速学习jQuery插件 Cookie插件使用方法
2015/12/01 Javascript
JS获取当前页面名称的简单实例
2016/08/19 Javascript
javascript简易画板开发
2020/04/12 Javascript
Jquery Easyui菜单组件Menu使用详解(15)
2016/12/18 Javascript
JS正则RegExp.test()使用注意事项(不具有重复性)
2016/12/28 Javascript
vuejs2.0子组件改变父组件的数据实例
2017/05/10 Javascript
解决vue页面刷新或者后退参数丢失的问题
2018/03/13 Javascript
vue异步axios获取的数据渲染到页面的方法
2018/08/09 Javascript
Vue CLI2升级至Vue CLI3的方法步骤
2019/05/20 Javascript
Vuex 模块化使用详解
2019/07/31 Javascript
vue项目在线上服务器访问失败原因分析
2020/08/14 Javascript
Python模块、包(Package)概念与用法分析
2019/05/31 Python
python try except返回异常的信息字符串代码实例
2019/08/15 Python
解决Django layui {{}}冲突的问题
2019/08/29 Python
Win10下安装并使用tensorflow-gpu1.8.0+python3.6全过程分析(显卡MX250+CUDA9.0+cudnn)
2020/02/17 Python
Lookfantastic意大利官网:英国知名美妆购物网站
2019/05/31 全球购物
意大利巧克力店:Chocolate Shop
2019/07/24 全球购物
营销专业应届生求职信
2013/11/26 职场文书
考试不及格检讨书
2014/01/09 职场文书
自荐书4要点
2014/01/25 职场文书
经贸日语专业个人求职信范文
2014/04/29 职场文书
幼儿园教师个人总结
2015/02/05 职场文书