gpt4 book ai didi

JavaScript:好的部分——如何完全不使用 `new`

转载 作者:IT王子 更新时间:2023-10-29 02:56:20 26 4
gpt4 key购买 nike

Crockford 的书JavaScript: The Good Parts 说(第 114 页)构造函数的名称应始终以大写字母开头(即点) ,并且首字母大写的函数名称应该与构造函数一起使用(其他一切都应该是小写)。

这个约定帮助我们避免忘记将 new 运算符与构造函数一起使用。

他接着说,“更好的应对策略是根本不使用 new。”

我的问题是,我们如何在完全不使用 new 的情况下编写 JavaScript?

  • 我们可以使用文字 {}[] 来避免 new Object()new Array() >.
  • 我们可以用0避免new Number()new Boolean()new String() >、true''
  • 我们可以用 /pattern/ 之类的东西来避免 new RegExp()

我们如何避免 new Date()

而且,最重要的是,我们如何避免将 new 与我们自己的自定义对象一起使用?

最佳答案

Crockford 给出了一个对象创建函数的示例,该函数本应由 JS 本身在他的 Javascript 演讲之一中提供,可在 http://developer.yahoo.com/yui/theater/ 上找到。

然而,YUI(3) 团队本身使用"new",他们确实遵循他的建议(因为他是雅虎首席 JS 架构师(更新:他继续前进,但最初写这个回复时声明是正确的) .我理解这个特殊的陈述更多是在“学术”层面上,应该是什么语言被设计“正确”并且没有一些基于类的继承东西的遗留物。他(恕我直言)说的方式事实证明 JS 是有冲突的,基于原型(prototype),但与“经典类”继承语言中的这一点有关。

然而,JS 就是这样,所以去使用"new"吧。

你可以在这里找到他的对象创建函数:http://javascript.crockford.com/prototypal.html

 if (typeof Object.create !== 'function') {
Object.create = function (o) {
function F() {}
F.prototype = o;
return new F();
};
}
newObject = Object.create(oldObject);


编辑:已更新为使用 Crockford 最新版本的该函数 - 共有三个。


更新 2015 年 6 月:我们有 Object.create(...)已经有一段时间了,所有当前的浏览器都支持(包括 IE 9 及更高版本),因此没有必要使用 Crockford 的功能。

但是,事实证明,如果您使用 Object.create,您应该确保不要经常这样做:该函数比使用新构造函数()!

参见 http://mrale.ph/blog/2014/07/30/constructor-vs-objectcreate.html有关解释(对于 V8 引擎),请参阅 http://jsperf.com/object-create-vs-crockford-vs-jorge-vs-constructor/62用于性能演示。

不拒绝 new Constructor(...) 的另一个原因是 ES6 classes即使只是出于大多数 Javascript 开发人员来自基于类的语言的简单原因,也肯定会得到广泛采用。

另请查看这篇文章,它为 Object.create 辩护:http://davidwalsh.name/javascript-objects-deconstruction

不管你喜不喜欢,尤其是在你想与广泛的人分享的项目中(在空间和时间上——意思是正确的或随着时间的推移,其他人接替你)有更多的理由使用 新的

更新 2015 年 9 月:对于我自己,我已经开始对所有内容使用 ES 2015 Javascript - 使用 io.js 和/或 Babel。除了 new Error(...) 之类的 Javascript 内置插件外,我也不在我的项目中使用 任何 new。我更喜欢使用功能强大得多的方法,我完全忽略了对象系统。 [my-object].prototypethis 完全从我的项目中消失了。在最长的时间里,我对这些想法持怀疑态度,“因为对象工作得很好”。但是在一个新的 (io.js) 项目开始时非常不情愿地尝试它之后,它“点击”了,我不明白为什么我浪费了二十年。好吧,不完全是,今天的 JS 引擎和硬件更有利于这种风格。特别是对于 ES 2015,我建议提供完全没有任何 thisclass 的函数式样式(新的 ES 2015 关键字或整个概念,基于使用 constructorFn .prototype) 一试。这可能需要你几周的时间,但一旦它“点击”,我保证你永远不会回去——不是自愿的。它更加方便和强大。

更新 2018 年 2 月:虽然我仍然按照我在上一次更新中写的内容进行操作,但我现在想补充一点,有时类(class)很好。没有绝对的。 :-)

关于JavaScript:好的部分——如何完全不使用 `new`,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5224295/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com