Crockford 提供了一个对象创建函数的示例,JS 本身应该在他的 Javascript 演讲中提供了一个示例,该演讲可在 http://developer.yahoo.com/yui/theater/ 上获得
然而,YUI(3) 团队本身使用“new”,并且他们确实遵循了他的建议(因为他是 Yahoo 首席 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(...) 已经有一段时间了,所有当前浏览器都支持(包括 IE 9 及更高版本),因此无需使用 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 classes 肯定会得到广泛采用,即使只是因为大多数 Javascript 开发人员来自基于类的语言这一简单原因。
还可以查看这篇文章,它主张 Object.create: http://davidwalsh.name/javascript-objects-deconstruction
不管你喜不喜欢,尤其是在你想与广泛的人分享的项目中(在空间和时间上——意思是正确的,也不是随着时间的推移,其他人接替你)有更多使用 @987654334 的理由@。
更新 2015 年 9 月:对于我自己,我已经开始使用 ES 2015 Javascript 来处理所有事情 - 使用 io.js 和/或 Babel。除了像 new Error(...) 这样的 Javascript 内置插件外,我也不会在我的项目中使用 any new。我更喜欢使用功能更强大的方法,我完全忽略了对象系统。 [my-object].prototype 和 this 完全从我的项目中消失了。很长一段时间以来,我都对这些想法持怀疑态度,“因为对象工作得很好”。但是在一个新的(io.js)项目开始时非常不情愿地尝试它之后,它“点击”了,我不明白为什么我浪费了二十年。好吧,不完全是,今天的 JS 引擎和硬件更有利于这种风格。特别是在 ES 2015 中,我建议提供一个完全没有任何 this 和 class(新的 ES 2015 关键字或整个概念,基于使用 constructorFn.prototype)的函数式样式。这可能需要你几个星期,但一旦它“点击”我保证你永远不会回去 - 不是自愿的。它更方便、更强大。
更新 2018 年 2 月:虽然我仍然在做我在上一次更新中写的内容,但我现在想补充一点,有时课程很好。没有绝对的。 :-)