Object.create({}): 这是一个好的实践吗?

4

我曾经和一些在公司中使用JavaScript的专业人士交流过,他们告诉我,即使我想要一个空对象,也不应该使用new或全局对象{}来创建一个对象实例,这不是一个好的做法。

var wrong1 = new Object();
var wrong2 = {};

根据他们和公司的标准,正确的方法是这样创建的:

按照标准,如下所示:

var correct = Object.create({});

将一个空对象作为空对象的原型似乎过于复杂甚至毫无意义。是否有人可以解释为什么推荐这样做,或者如果不推荐,为什么不推荐?(可能的优缺点)

5
根据这些准则,传递空对象字面量{}是不正确的,对吗?使用Object.create(Object.create({}))会更好,不是吗?;) - el.pescado - нет войне
3
@el.pescado - 这很好,但这是防弹的:function create(){return Object.create(create())} - Lee Gunn
1
@Oleg 但这不是这里所问的。 - charlietfl
2
有时候你可能想让你的对象没有原型,可以使用 Object.create(null)。例如,如果你需要某种缓存并且想要避免名称冲突,又不想使用 hasOwnProperty,那么这个方法就很适合。但是 Object.create({}) 看起来就像是完全多余的。 - Yury Tarabanko
显示剩余6条评论
1个回答

6
对象字面量将创建一个具有以下原型链的对象。
Object.prototype -> {}

文字直接量是由于它是一种常见模式,所以大多数引擎都对其进行了重度优化。
相比之下,Object.create({}) 创建的对象具有更长的原型链。
Object.prototype -> {} -> {}

实例(最右侧)的原型为{},如前所述,它已经具有Object.prototype的原型。 Object.create是一个非常有用的函数,用于创建具有自定义原型的对象,并且它不会遭受与new相同的问题。然而,在这里我们不需要它,因为{}已经创建了一个具有更短原型链的对象。
我不知道为什么有人认为添加这个额外的间接层(和性能损失)是一种“最佳实践”。
如果说什么的话,我会说字面语法更安全-因为没有办法意外/恶意地重新定义{},而Object可以被遮蔽。
var Object = 3;
// ...
Object.create({}) // TypeError: Object.create is not a function(...)

当然,这并不意味着你永远不应该使用Object,但在这种情况下,我认为{}是完成工作的最简单工具,因此它也具有最佳性能。

你说得很对。Object可以被遮蔽,.create函数也可以被遮蔽。 - Bruno Finger
1
我的猜测是有人非常苛刻,认为如果Object.create()存在...那么它肯定更好。 - charlietfl
那么根据这个评论,我可以假设 var a = {}var b = new Object() 更安全? - Bruno Finger
@BrunoFinger 是的。尽可能使用字面语法,这是最容易阅读(对于其他程序员)和优化(对于编译器)的方式。 - Dan Prince
1
故事的寓意是:不要让人们在没有充分理由的情况下告诉你什么是最佳实践。 - Jonathan

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接