Javascript Object.create的用例(null)

Javascript Object.create的用例(null),javascript,prototype,javascript-objects,Javascript,Prototype,Javascript Objects,我知道使用Object.create(null)会创建一个没有proto属性的对象(即Object.getPrototypeOf(myObj)==null),但是有人能帮我理解这方面的一些用例吗 换句话说,为什么要创建一个完全为空的对象(即不从对象.prototype)继承任何方法?在非常罕见的情况下,某些东西可能已添加到对象.prototype Object.prototype.bar = 'bar'; 最好使用Object.create(null)创建一个对象,因为它不会继承这个属性,请考

我知道使用
Object.create(null)
会创建一个没有
proto
属性的对象(即
Object.getPrototypeOf(myObj)==null
),但是有人能帮我理解这方面的一些用例吗


换句话说,为什么要创建一个完全为空的对象(即不从
对象.prototype
)继承任何方法?

在非常罕见的情况下,某些东西可能已添加到
对象.prototype

Object.prototype.bar = 'bar';
最好使用
Object.create(null)
创建一个对象,因为它不会继承这个属性,请考虑

({}).bar;                // bar
// vs
Object.create(null).bar; // undefined
这意味着您不必担心,例如,如果您在循环中为..使用了

此外,您还可以使测试失败

Object.create(null) instanceof Object; // false

这是因为
instanceof
基本上是针对RHS测试原型链,而没有这样的链。

您可以将这样的对象用于键值映射。如果没有prototype链,您可以确保像
.toString()
这样的东西不会无意中存在于对象上。这意味着您可以不小心地访问它的属性,并且您可以使用
in
操作符而不是
Object.prototype.hasOwnProperty.call

它实际上没有多大用处,但是在某些情况下,如果将内容添加到prototype链中,您可能不希望在对象中使用它。在其他情况下,您希望使用键,例如
valueOf
toString
,但是您会遇到一个问题,因为它们已经从
对象继承而来,除非你创建了一个不继承这些属性的对象等。我希望对象的实例失败的用例是什么?@Bergi也许如果你想在代码中走另一条你无法更改的代码路径,或者,如果您想创建一个带有原型链的自定义数据结构,该原型链的处理方式与对象不同,但在筛选出对象实例之前不想做出决定?我并不是说这些用法会很普遍。
中的+1、
是一个非常有用的运算符,以这种方式避免意外的正面效果可能非常有用。