`
yiminghe
  • 浏览: 1460413 次
  • 性别: 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
分享到:
评论

相关推荐

    javascript基本包装类型介绍

    JavaScript语言为了解决基本...但同时,我们也要注意不要滥用new运算符来创建基本包装类型的对象,避免在逻辑处理上产生混乱。正确的做法是使用基本类型的值,当需要使用到对象特有的方法时,再考虑创建相应的对象。

    delphi设计简单的web浏览器捕捉NewWindow2事件,即新开窗口事件2

    这有助于避免弹出窗口的滥用,或者在特定场景下保持用户的浏览体验一致。同时,也可以根据具体需求进行扩展,例如记录新窗口请求、在指定的子窗口中打开链接等。 请注意,由于这个方法依赖于IE的ActiveX控件,因此...

    NewService-开源

    它通过分析聊天内容和用户行为模式来检测潜在的垃圾信息,并可以设置规则以自动或手动封锁发送垃圾信息的用户,从而保护服务器免受滥用。 Trojanscan是另一个重要的安全工具,其目的是检测并防止恶意软件(trojans...

    信息安全_数据安全_API Abuse Through Mobile Apps New Atta.pdf

    【API滥用:移动应用中的新攻击与防御】 API(应用程序编程接口)滥用是当前信息安全领域的一个重大问题,尤其是在移动应用中。随着企业越来越多地依赖API来传输数据和提供服务,这些接口成为了攻击者的目标。根据...

    Security and privacy in 6G networks:New areas and new challenges

    这篇论文的主题"Security and privacy in 6G networks:New areas and new challenges"正是针对这些问题进行深入探讨。 6G网络安全性的新领域: 1. **量子通信技术**:6G可能会采用量子通信技术,如量子密钥分发...

    SCI写作中易混淆、滥用的单词和短语

    ### SCI写作中易混淆、滥用的单词和短语详解 #### About vs. approximately 在日常英语交流中,"about" 是一个非常常见的词汇,但在科技写作中,为了精确度和专业性,通常推荐使用 "approximately"。比如,在描述...

    New-injector

    5. **安全性和合法性**:尽管程序注入有其合法用途,但滥用也可能导致安全风险,比如被恶意软件利用。因此,了解和遵循相关的法律和道德规范对于使用New-injector至关重要。 深入研究New-injector,开发者可以学习...

    搜索引擎-搜索引擎服务商滥用市场支配地位的法律规制.pdf

    The emergence of new characteristics such as bilateral platforms, network externalities, and cross-price subsidies in the search engine service market makes it very different from traditional single-...

    The New SU User's Manual

    **3.1.3 SEG-Y滥用** 在实际应用中,有时会出现SEGY文件不符合标准的情况,这可能会影响到数据的正确读取。因此,在使用SEGY数据时需要注意数据格式的一致性和准确性。 **3.1.4 SEGYWRITE - 写入SEGY磁带或磁盘...

    New Tab Extension-crx插件

    New Tab Extension-crx在设计时可能会考虑到这一点,确保用户的浏览习惯和个人信息不会被滥用。 8. **兼容性**:由于是crx格式的插件,New Tab Extension通常适用于基于Chromium内核的浏览器,如Google Chrome、...

    感冒发烧经验集new.doc

    这篇文档主要探讨了感冒和发烧的处理方法,强调了避免滥用抗生素的重要性,并提供了中医和西医的不同观点。 首先,文档中提到滥用抗生素是全球关注的问题,尤其在感冒治疗中。抗生素主要用于对付细菌感染,而大多数...

    Security and privacy in 6G networks:New areas and new challenges.pdf

    隐私保护则关注个人和企业数据的保护,以防止数据被滥用。这两方面是6G网络发展的关键挑战,因为6G技术预期将实现更高的数据传输速率、更低的延迟以及更广的覆盖范围,同时将集成更多智能化的功能。 当前对6G网络...

    new抗生素报表.pdf

    医院对抗生素的管理和使用是医疗工作中至关重要的一环,尤其在控制抗生素滥用、防止抗药性发展以及保障患者安全方面起着决定性作用。以下根据提供的报表内容,分析了几个关键知识点: 1. **抗菌药物分类**: 报表...

    A new way to hack android app info

    5. **权限滥用**:如果应用请求了不必要的权限,黑客可能会利用这些权限获取敏感信息。 6. **恶意代码插入**:在合法应用中插入恶意代码,如通过篡改APK或利用签名漏洞,可以实现远程控制或数据盗窃。 7. **代码混淆...

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

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

    New-key-scanner.rar_Objective Key_key scanner

    5. 安全与隐私:按键扫描可能涉及用户隐私问题,因此程序设计时必须考虑数据保护措施,确保信息不被滥用。 6. 用户行为分析:这种扫描程序可以用于优化输入设备的性能,比如通过学习用户习惯来改进键盘布局或自动...

    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常问问题这是合法的吗? 代理滥用目前在大多数州都是合法的,但...

    黑瞳远控2011NEW-已集成XTP-VC6.0完整即可编译.rar

    这类软件可能用于技术支持、远程办公、教育等领域,但有时也可能被滥用进行非法活动。 **XTP-VC6.0**:XTP可能是一个专为C++开发的库,特别是为Visual C++ 6.0版本设计。VC6.0是微软的老版IDE,尽管已被更新版本...

    graph-cli-master-new_knowledgeisp_graph_wasm_TheMaster_

    这在处理敏感的区块链数据时尤为重要,因为错误的映射可能会导致数据泄露或资源滥用。 综上所述,"graph-cli-master-new_knowledgeisp_graph_wasm_TheMaster_"项目展示了WASM技术如何革新The Graph的数据处理方式,...

Global site tag (gtag.js) - Google Analytics