- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
在另一个 question ,一位用户指出 new
关键字使用起来很危险,并提出了一个不使用 new
的对象创建解决方案.我不相信这是真的,主要是因为我使用过 Prototype、Scriptaculous 和其他优秀的 JavaScript 库,而且他们都使用了 new
。关键词。
尽管如此,昨天我在 YUI 剧院看 Douglas Crockford 的演讲,他说了同样的话,他没有使用 new
。他的代码中不再有关键字( Crockford on JavaScript - Act III: Function the Ultimate - 50:23 minutes )。
使用 new
是不是“不好”?关键词?使用它的优点和缺点是什么?
最佳答案
Crockford 在推广优秀的 JavaScript 技术方面做了很多工作。他对语言关键要素的固执己见引发了许多有益的讨论。也就是说,有太多的人把每一个“坏”或“有害”的宣言都当作福音,拒绝超越一个人的看法。有时可能会有点令人沮丧。
使用 new
提供的功能与从头开始构建每个对象相比,关键字有几个优点:
new
关键字是使用它的规范(也是唯一可用的跨平台)方法。 prototype
并使用 new
剔除新对象。这不仅更快(原型(prototype)上的每个方法都不需要代码),而且避免了为每个方法使用单独的属性来膨胀每个对象。在速度较慢的机器(尤其是速度较慢的 JS 解释器)上,当创建许多对象时,这可能意味着显着节省时间和内存。 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
的优势了无需担心意外误用导致的问题。
with
上的
章节 对于我们这些最初将这个备受诟病的功能视为噱头的人来说尤其具有启发性) .
if ( !(this instanceof arguments.callee) )
throw new Error("Constructor called as a function");
请注意,此代码段能够避免对构造函数名称进行硬编码,因为与前面的示例不同,它不需要实际实例化对象 - 因此,可以将其复制到每个目标函数中而无需修改。
arguments.callee
在 ES5 的
strict mode 中无效.因此,如果您在该上下文中使用上述模式,它将引发错误。
new
ES6 引入
Classes到 JavaScript - 不,不是老派 Crockford 所做的那种怪异的 Java 模仿方式,而是在精神上更像他(和其他人)后来采用的轻量级方式,采用原型(prototype)继承和烘焙通用模式的最佳部分融入语言本身。
new
:
class foo
{
constructor()
{
// constructor logic that will ONLY be hit
// if properly constructed via new
}
}
// bad invocation
foo(); // throws,
// Uncaught TypeError: class constructors must be invoked with 'new'
但是,如果您不想使用新糖怎么办?如果您只想使用上面显示的那种安全检查来更新您完美的旧式原型(prototype)代码,以便它们继续在严格模式下工作怎么办?
new.target
:
function foo()
{
if ( !(new.target) )
throw new Error("Constructor called as a function");
// constructor logic follows...
}
因此,无论您选择哪种方法,您都可以 - 稍加考虑并保持良好的卫生习惯 - 使用
new
没有伤害。
关于javascript - JavaScript 的 "new"关键字是否被认为是有害的?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29733442/
就目前而言,这个问题不适合我们的问答形式。我们希望答案得到事实、引用或专业知识的支持,但这个问题可能会引起辩论、争论、投票或扩展讨论。如果您觉得这个问题可以改进并可能重新打开,visit the he
我在摆弄 LinqToSQL 和 LINQPad,我注意到 SingleOrDefault() 没有对生成的 SQL 进行任何过滤或限制(我几乎期望与 Take(1) 等效)。 因此,假设您想保护自己
我是一名优秀的程序员,十分优秀!