在另一个问题中,用户指出该new关键字使用很危险,并提出了不使用该对象创建对象的解决方案new。我不相信这是真的,主要是因为我使用了Prototype,Scriptaculous和其他出色的JavaScript库,并且每个人都使用了new关键字。
new
尽管如此,昨天我还是在DouglasCrockford在YUI剧院观看了一次演讲,他说的一模一样,他new不再在代码中使用关键字(JavaScript上的Crockford-ActIII:终极功能-50:23分钟)。
使用new关键字是否“不好” ?使用它的优缺点是什么?
Crockford在推广良好的JavaScript技术方面做了很多工作。他对语言关键要素的自以为是的态度引发了许多有用的讨论。就是说,太多的人把每一个“坏”或“有害”的宣告当作福音,拒绝超越一个人的视线。有时可能会令人沮丧。
new与从头开始构建每个对象相比,使用关键字提供的功能具有多个优点:
prototype
是的,它new有一个关键的劣势,其他答案对此有很好的描述:如果您忘记使用它,您的代码将在没有警告的情况下中断。幸运的是,这种缺点很容易消除- 只需向函数本身添加一些代码即可:
function foo() { // if user accidentally omits the new keyword, this will // silently correct the problem... if ( !(this instanceof foo) ) return new foo(); // constructor logic follows... }
现在,您可以拥有new不必担心因意外滥用而引起的问题的优点。如果对破坏代码的想法无声地起作用,您甚至可以在检查中添加一个断言。或者,如某些评论所述,使用检查来引入运行时异常:
if ( !(this instanceof arguments.callee) ) throw new Error("Constructor called as a function");
(请注意,此代码段能够避免对构造函数名称进行硬编码,因为与前面的示例不同,它无需实际实例化对象-因此,可以将其复制到每个目标函数中,而无需进行修改。)