`
yiminghe
  • 浏览: 1432768 次
  • 性别: Icon_minigender_1
  • 来自: 上海
社区版块
存档分类
最新评论

不要滥用 new

阅读更多

By Douglas Crockford

 

 

 

javascript是一种原型语言,但是他有new操作符使得它又像是传统的面向对象语言,这种情况经常使得程序员疑惑,导致一些错误 的编程模式

你从来不需要使用 new Object() ,直接用{}就好了,不要使用 new Array() ,用 []代替,javascript里的数组和java里的差不多 ,用java模式的编程模式反而会使你疑惑的。

不要使用  new Number, new String, or 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.onchange = function (i) {

return function () {

dynamicOptionListObjects[i].change(this);

};

}(dol.index);
 



把 new 放在 function 的做法前面不好,例如new 在构造新对象时并没有什么优势:

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, 我们就不用在原型链上保存无用的原型对象。用工厂方法才是正确的做法:

var foo = function () {

function processMessages(message) {

alert(”Message: ” + message.content);

}

return {

init: function () {

subscribe(”/mytopic”, this, processMessages);

}

};

}();
 



所以规则很简单,唯一正确使用new的时机是调用用于模拟类的构造函数的时候,当函数作为构造函数调用时, new是必须的。

总之:请在合适的时间,合适的地点使用 new 吧。

3
0
分享到:
评论

相关推荐

    Net-Abuse-Reporter:尝试使网络滥用报告更容易

    $reporter = Net::Abuse::Reporter->new()创建并准备报告引擎。 $reporter->add_incident($logs)吸收一个“事件”的日志,例如 垃圾邮件的完整标题和正文 来自 Apache、IPTables、Fail2ban 等的一个日志条目 一个...

    props:一个 JavaScript DSL 编写,无辜地滥用 ES6 代理

    let program = ( new Props ) . let . x . $1 . plus . $2 . in . let . y . $2 . in . x . plus . y ; console . log ( program ( 6 , 3 ) ) // => 12常问问题这是合法的吗? 代理滥用目前在大多数州都是合法的,但...

    大量Task创建导致UI失去响应

    Task<string> tt = Task.Factory.StartNew(test, i); tt.ContinueWith((t) => { if (t.IsFaulted) { string msg=(string.Format("I have observed a {0}", t.Exception.InnerException.GetType().Name)); } ...

    谷歌师兄的leetcode刷题笔记-gae-records:Go中GoogleAppEngine数据源的ActiveRecord包装

    重点:只解决常见的数据存储问题,不要试图重新发明轮子 性能:必须与直接使用数据存储 API 相媲美,几乎没有额外开销 配额意识:不得滥用数据存储,完全了解存储和与数据交互的成本 项目状态 准备使用 - 向下滚动...

    角空间x-graphql-codegen

    该API是免费的,因此请保持友好,不要滥用它。最终结果脚步使用路由生成新的角度应用程序ng new angular-spacex-graphql-codegen --routing=true --style=css 确保删除src/app/app.component.html的默认模板安装并...

    Mac Miller - New Tab in HD-crx插件

    19精心挑选照片供Mac Miller珍惜他。 马尔科姆·詹姆斯·麦考密克(Malcolm James ...米勒与滥用毒品作斗争,这在他的歌词中经常提到。在这里,我们为您提供19张精心挑选的照片,供Mac Miller珍惜他。 支持语言:English

    Technology Mess-crx插件

    语言:English 如何指南,关于aandroid,Windows,iOS。 TechnologyMess是一个网站,提供有关Windows...* Windows * Android * iOS * MAC网站报告滥用情况附加信息版本:0.1更新:2018年2月23日大小:4.02KiB语言:英语

    magento-api-rest:NodeJS包装器与Magento REST API通信

    确保检查资源访问是否符合您的要求,以防止滥用API密钥。 查看可以操纵的Magento API端点和数据。设置Magento REST API集成的设置ECMAScript模块示例 import Magento from "magento-api-rest" ;const client = new ...

    proposal-dynamic-code-brand-checks:TC39建议可在动态代码加载之前进行灵活的品牌检查

    动机 eval是邪恶的eval函数是JavaScript中最常被滥用的功能。 躲开它。 -Douglas Crockford,“ JavaScript:好的部分” eval及其友善的new Function存在问题,因为攻击者经常可以将其针对应用程序。 大多数代码都...

    notify:一个死去的简单的Go库,用于向各种消息传递服务发送通知

    免责声明对本库的任何滥用是您的责任和责任,不能归因于本库的作者。 有关更多信息,请参见。 使用此库发送垃圾邮件可能会永久禁止您在大多数受支持的平台上使用。安装go get -u github.com/nikoksr/notify用法示例 ...

    awesome-namestorage:nameStorage 是类似 sessionStroage 的键值对数据存储工具,但是可以跨域

    window.name 非常有用,但不可滥用。 为了规范、简单便利、安全的使用 window.name,制造了这个模块。 更多请参考 window.name 使用规范。 使用说明 const key = "key"; const value = "value"; const nameStorage =...

    修改

    警告:滥用此功能不是autorclone的目的,我们不建议您做很多项目,只有一个项目和100 sa可以让您大量使用,过度使用也有可能使您的项目被Google禁止。 Note: 1 service account can copy around 750gb a day, 1 ...

    motion-sqlite3:用于RubyMotionSQLite 3 C API的最小包装

    故意裸露它是为了限制与原始C API交互的代码的表面积(滥用C API可能会导致资源泄漏和段错误)。 可以将它更多地看作是SQLite的驱动程序。 只要有可能,它就会使用诸如块和异常之类的Ruby惯用语。 有什么好处吗? ...

    php-unique-gmail-address:确保Gmail地址唯一的软件包

    可以有无数个指向单个Gmail收件箱/帐户的不同Gmail地址,这可以使恶意用户很容易地毫不费力地滥用。 要了解有关用户如何为一个Gmail收件箱创建无限地址的更多信息, 。 使用此程序包,可以检测一个Gmail帐户的...

    使用C++11实现Android系统的Handler机制

    以Java语言为例,我们可以直接new一个Thread对象,然后覆盖run方法,最后调一下start方法便可以成功运行一个线程。如果我们每次异步做一些耗时处理都单独开启一个线程,比如异步加载网络图片这种高并发操作,每张...

    trybuild:用于编译器诊断的ui测试的测试工具

    试用版 Trybuild是一种测试工具,... [ dev-dependencies ]trybuild = " 1.0 " 编译器支持:需要rustc 1.36+编译失败测试最小的trybuild设置如下所示: #[test]fn ui () { let t = trybuild :: TestCases :: new ();

    chain:通过 Ruby 中的方法链访问 API 端点

    自 2013 年以来滥用method_missing :trade_mark: 什么是山姆山中的链条? Chain 是一个简单的库,可以(太)轻松地与(非)RESTful Web API 交互。 受启发,我需要一种方法来创建模仿 ORM 的东西,以便与非 RE​​...

    isodata的matlab代码博客-NotesMongoDB:笔记MongoDB

    但它建议使用某种模式来防止滥用文档。 安装 小费 小费 要测试是否安装了数据库,您可以通过运行来检查: mongod --version 启动数据库 默认使用 /data/db 作为存储路径,如果遵循此标准,您可以不带任何参数启动...

    validated-literals:部分智能构造函数的编译时检查

    在这种情况下,智能构造函数迫使我们在运行时处理潜在的转换失败,或者滥用诸如fromJust功能来破坏智能构造函数提供的所有安全性。 尽管我们可以在编译时静态地知道转换将始终成功还是始终失败,但所有这一切都是...

    AudioPick:Chrome扩展程序可为HTML5音频和视频元素选择默认的音频输出设备

    它还没有找到尚未插入文档树的音频/视频节点对象( new Audio(...) )。 请注意,该API需要为每个需要处理音频接收器的站点成功调用getUserMedia() ,从而导致在contentSettings['microphone']下创建条目,即,它...

Global site tag (gtag.js) - Google Analytics