使用Object.create(null)创建JS对象?

2020/11/10 21:22 · javascript ·  · 0评论

我知道创建JS对象的很多方法,但我不知道Object.create(null)

题:

是否与以下内容完全相同:

var p = {}

var p2 = Object.create(null);

它们不相等。{}.constructor.prototype == Object.prototypeObject.create(null)不会继承任何东西,因此根本没有任何属性。

换句话说:默认情况下,除非您以null为原型明确创建它,否则javascript对象将从Object继承,例如:Object.create(null)

{}而是等效于Object.create(Object.prototype)


在Chrome Devtool中,您可以看到Object.create(null)没有__proto__属性,而属性{}

在此处输入图片说明

它们绝对不是等效的。我正在写此答案,以更全面地说明为什么会有所作为。

  1. var p = {};

    创建一个对象,该对象继承的属性和方法Object

  2. var p2 = Object.create(null);

    创建一个不继承任何内容的对象。

如果将对象用作地图,并且使用上述方法1创建对象,则在地图中进行查找时必须格外小心。因为from的属性和方法Object是继承的,所以您的代码可能会遇到映射中存在从未插入的键的情况。例如,如果您在上进行了查找toString,即使您从未在其中放置该值,也可以找到一个函数。您可以这样解决:

if (Object.prototype.hasOwnProperty.call(p, 'toString')) {
    // we actually inserted a 'toString' key into p
}

请注意,可以给分配一些东西p.toString,它只会覆盖继承的toString函数p

请注意,您不能仅仅这样做,p.hasOwnProperty('toString')因为您可能已经在其中插入了键“ hasOwnProperty” p,因此我们强制其在中使用实现Object

另一方面,如果您使用上面的方法2,则不必担心Object地图上出现的事物

您无法使用以下简单方法检查属性的存在if

// Unreliable:
if (p[someKey]) {
    // ...
}

该值可能是一个空字符串,可能是false,或null,或undefined,或0NaN,等等。要检查某个属性是否存在,仍然需要使用Object.prototype.hasOwnProperty.call(p, someKey)

通过使用创建对象{}将创建一个对象,该对象的原型Object.prototype将从Object原型继承基本功能,而通过使用创建对象Object.create(null)将创建一个空对象,其原型为null。

如果有人正在寻找实施Object.create(null),那就知道它是如何工作的。它是使用__proto__非标准语言编写的,因此不推荐使用

function objectCreateMimic()
{
  /*optional parameters: prototype_object, own_properties*/
  var P = arguments.length>0?arguments[0]:-1;
  var Q = arguments.length>1?arguments[1]:null;
  var o = {};
  if(P!==null && typeof P === "object")
  {
    o.__proto__ = P;
  }
  else if(P===null)
  {
    o.__proto__ = null;
  }
  if(Q!==null && typeof Q === "object")
  {
   for(var key in Q)
   {
     o[key] = Q[key];
   }
  }
  return o;
}

注意:我出于好奇而编写了此文件,并且它仅是用简单的术语编写的,例如,我没有将属性描述符从第二个对象传输到返回对象。

使用Object.create(null)创建对象时,这意味着您正在创建没有原型的对象。null此处表示原型链的末尾。但是,当您创建类似{}的对象时,将添加对象原型。因此,这是两个不同的对象,一个带有原型,另一个没有原型。

本文地址:http://javascript.askforanswer.com/shiyongobject-createnullchuangjianjsduixiang.html
文章标签:
版权声明:本文为原创文章,版权归 javascript 所有,欢迎分享本文,转载请保留出处!

文件下载

老薛主机终身7折优惠码boke112

上一篇:
下一篇:

评论已关闭!