Object.create(null)的用例?

时间:2014-11-16 20:13:33

标签: javascript null prototype

如果使用说var obj = {};创建常规javascript对象,它将具有对象原型。使用var obj = new MyClass();创建的对象也是如此。在引入Object.create之前,没有办法解决这个问题。但是现在可以使用null创建一个没有原型的对象(分别为var obj = Object.create(null);作为其原型)。

为什么这很重要?它带来了什么好处?有没有现实世界的用例?

2 个答案:

答案 0 :(得分:10)

它是一个完全空的对象(没有任何继承自任何.prototype包含Object.prototype),因此可以保证只有在将属性显式添加到对象时,任何属性查找才会成功。

例如,如果您希望将某些数据存储在您不会事先知道密钥的位置,则提供的密钥可能与Object.prototype的成员具有相同的名称,并导致错误。

在这些情况下,您需要执行显式.hasOwnProperty()检查以排除意外的继承值。但如果没有遗传,您的测试可以简化为if (key in my_object) {测试,或者可能是简单的真理测试if (my_object[key]) {

此外,由于没有原型链,我认为查找不存在的属性会更快,因为只需要检查直接对象。是否实际调整(由于优化)将通过性能测试来确定。

答案 1 :(得分:0)

创建具有NULL{}的对象之间的唯一区别是Object原型不会从中继承。

这意味着我们通常假设我们可以调用任何对象的任何方法都不存在,例如Object.create(null)toString。可以在此处找到这些列表:https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Object/prototype

从性能的角度来看,简单地通过valueOf创建对象实际上要快得多,所以除非你特别不能拥有Object原型下的函数,否则你不应该以这种方式创建对象。

http://jsperf.com/null-vs-empty-object-performance