在他的JavaScript演讲中,Crockford给出了一个对象创建函数的示例,这个函数应该由JS本身提供,可以在http://developer.yahoo.com/yui/theater/找到。
然而,YUI(3)团队本身使用"new",他们确实遵循了他的建议(因为他曾经是雅虎首席JS架构师(更新:当这个回答最初写下时,此说法是正确的)。我理解这个具体的说法更多地是在“学术”层面上,如果语言被设计得“正确”,而不是带有一些基于类的继承的剩余物,那么它应该是什么样子的。他(我认为是正确的)指出JS的现状非常矛盾,基于原型,但同时也有来自“经典类”继承语言的东西。
然而,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(...)
很长一段时间了,所有现代浏览器都支持(包括IE9及以上版本),因此没有必要使用Crockford的函数。
然而,事实证明,如果你使用Object.create
,你应该确保不要频繁使用:那个函数比使用new Constructor()
慢得多!
请参见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类即使只是因为大多数JavaScript开发人员来自基于类的语言,也肯定会得到广泛的采用。
还要查看这篇文章,该文章辩称支持Object.create
:http://davidwalsh.name/javascript-objects-deconstruction
无论你喜欢与否,特别是在你想与广泛的人(在空间和时间上 - 意味着现在或以后,在你之后由其他人接管)分享项目时,使用new
的原因更多。
更新 2015年9月:对于我自己,我已经开始使用ES 2015 JavaScript来做所有事情 - 使用io.js和/或Babel。我在我的项目中也不使用任何new
,除了像new Error(...)
这样的JavaScript内置函数。我更喜欢使用功能强大得多的函数式方法,我完全忽略对象系统。[my-object].prototype
和this
在我的项目中完全消失了。长期以来,我非常怀疑这些想法,因为“对象可以正常工作”。但是,在新(io.js)项目的开始非常勉强地尝试之后,它“就开窍了”,我不明白为什么我浪费了20年时间。好吧,不完全是这样,今天JS引擎和硬件更有利于这种风格。特别是在ES 2015中,我建议尝试一个完全不包含this
和class
(新的ES 2015关键字或基于使用constructorFn.prototype
)的函数式风格。可能需要你几个星期,但一旦“开窍了”,我保证你永远不会回去 - 不自愿的。它更方便、更强大。
更新 2018年2月:虽然我仍然执行我在上一个更新中写的内容,但现在我想要补充一点,有时候