由Object.create(null)引发的思考🤔

265 阅读1分钟

Object.create 和 null

我们先看看MDN上关于Object.createnull的描述:

  • Object.create(): 该方法创建一个新对象,使用现有的对象来提供创建的对象的__proto__。如果proto参数不是null或者非原始包装对象,则抛出一个TypeError异常
  • null: 特值对象的值未设置,是JavaScript的基本类型之一,在布尔运算中被称为是falsy

原型链

通过Object.create()的描述,我们可以轻易得到以下结论:

let objOrigin = {age: 18};
let obj = Object.create (objOrigin);

obj.__proto__ === objOrigin; // true

然后再来看看原型链:

Object.prototype.__proto__ === null; // true

let o = Object.create(null);

按理来说 o.__proto__ === null应该为true

o.__proto__ === null; // false
o === null; // false

那么为什么会出现false的情况呢,我们打开控制台查看一下o

截屏2022-06-06 12.20.06.png 发现o里面什么都没有,但是可以看出o是一个什么都没有的空对象,甚至连__proto__都没有。

typeof o; // 'objcet'
typeof null; // 'object'

Object.prototype.toString.call(o); // '[object Object]'
Object.prototype.toString.call(null); // '[object Null]'

结论

经过以上探讨可以得出以下结论: 经过Object.create(null) 创建出来的结果是一个空对象,但是又不是普通的空对象,里面没有任何信息,包括__proto__

一般创建的对象有原型链:

截屏2022-06-06 13.08.28.png

如有错误,欢迎读者指出。