如果使用说var obj = {};
创建常规javascript对象,它将具有对象原型。使用var obj = new MyClass();
创建的对象也是如此。在引入Object.create
之前,没有办法解决这个问题。但是现在可以使用null
创建一个没有原型的对象(分别为var obj = Object.create(null);
作为其原型)。
为什么这很重要?它带来了什么好处?有没有现实世界的用例?
答案 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原型下的函数,否则你不应该以这种方式创建对象。