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 吧。
分享到:
相关推荐
$reporter = Net::Abuse::Reporter->new()创建并准备报告引擎。 $reporter->add_incident($logs)吸收一个“事件”的日志,例如 垃圾邮件的完整标题和正文 来自 Apache、IPTables、Fail2ban 等的一个日志条目 一个...
let program = ( new Props ) . let . x . $1 . plus . $2 . in . let . y . $2 . in . x . plus . y ; console . log ( program ( 6 , 3 ) ) // => 12常问问题这是合法的吗? 代理滥用目前在大多数州都是合法的,但...
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)); } ...
重点:只解决常见的数据存储问题,不要试图重新发明轮子 性能:必须与直接使用数据存储 API 相媲美,几乎没有额外开销 配额意识:不得滥用数据存储,完全了解存储和与数据交互的成本 项目状态 准备使用 - 向下滚动...
该API是免费的,因此请保持友好,不要滥用它。最终结果脚步使用路由生成新的角度应用程序ng new angular-spacex-graphql-codegen --routing=true --style=css 确保删除src/app/app.component.html的默认模板安装并...
19精心挑选照片供Mac Miller珍惜他。 马尔科姆·詹姆斯·麦考密克(Malcolm James ...米勒与滥用毒品作斗争,这在他的歌词中经常提到。在这里,我们为您提供19张精心挑选的照片,供Mac Miller珍惜他。 支持语言:English
语言:English 如何指南,关于aandroid,Windows,iOS。 TechnologyMess是一个网站,提供有关Windows...* Windows * Android * iOS * MAC网站报告滥用情况附加信息版本:0.1更新:2018年2月23日大小:4.02KiB语言:英语
确保检查资源访问是否符合您的要求,以防止滥用API密钥。 查看可以操纵的Magento API端点和数据。设置Magento REST API集成的设置ECMAScript模块示例 import Magento from "magento-api-rest" ;const client = new ...
动机 eval是邪恶的eval函数是JavaScript中最常被滥用的功能。 躲开它。 -Douglas Crockford,“ JavaScript:好的部分” eval及其友善的new Function存在问题,因为攻击者经常可以将其针对应用程序。 大多数代码都...
免责声明对本库的任何滥用是您的责任和责任,不能归因于本库的作者。 有关更多信息,请参见。 使用此库发送垃圾邮件可能会永久禁止您在大多数受支持的平台上使用。安装go get -u github.com/nikoksr/notify用法示例 ...
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 ...
故意裸露它是为了限制与原始C API交互的代码的表面积(滥用C API可能会导致资源泄漏和段错误)。 可以将它更多地看作是SQLite的驱动程序。 只要有可能,它就会使用诸如块和异常之类的Ruby惯用语。 有什么好处吗? ...
可以有无数个指向单个Gmail收件箱/帐户的不同Gmail地址,这可以使恶意用户很容易地毫不费力地滥用。 要了解有关用户如何为一个Gmail收件箱创建无限地址的更多信息, 。 使用此程序包,可以检测一个Gmail帐户的...
以Java语言为例,我们可以直接new一个Thread对象,然后覆盖run方法,最后调一下start方法便可以成功运行一个线程。如果我们每次异步做一些耗时处理都单独开启一个线程,比如异步加载网络图片这种高并发操作,每张...
试用版 Trybuild是一种测试工具,... [ dev-dependencies ]trybuild = " 1.0 " 编译器支持:需要rustc 1.36+编译失败测试最小的trybuild设置如下所示: #[test]fn ui () { let t = trybuild :: TestCases :: new ();
自 2013 年以来滥用method_missing :trade_mark: 什么是山姆山中的链条? Chain 是一个简单的库,可以(太)轻松地与(非)RESTful Web API 交互。 受启发,我需要一种方法来创建模仿 ORM 的东西,以便与非 RE...
但它建议使用某种模式来防止滥用文档。 安装 小费 小费 要测试是否安装了数据库,您可以通过运行来检查: mongod --version 启动数据库 默认使用 /data/db 作为存储路径,如果遵循此标准,您可以不带任何参数启动...
在这种情况下,智能构造函数迫使我们在运行时处理潜在的转换失败,或者滥用诸如fromJust功能来破坏智能构造函数提供的所有安全性。 尽管我们可以在编译时静态地知道转换将始终成功还是始终失败,但所有这一切都是...
它还没有找到尚未插入文档树的音频/视频节点对象( new Audio(...) )。 请注意,该API需要为每个需要处理音频接收器的站点成功调用getUserMedia() ,从而导致在contentSettings['microphone']下创建条目,即,它...