1. 程式人生 > >Object.create(null) 和 {} 的區別

Object.create(null) 和 {} 的區別

這兩天在看vue的原始碼,發現作者定義對映字典的時候,喜歡用Object.create(null),而不是直接定義一個物件字面量,那麼兩者有什麼區別呢,又存在什麼業務場景呢

   let m = Object.create(null);
   let n = {};
   
   // 猜測下,m和n有什麼區別呢
   console.log(m);
   console.log(n);
複製程式碼

就是一個純粹的空物件

繼承了物件原型的空物件,也就是說存在n.toString();

Object.create(proto, [propertiesObject]) 方法

  • proto 新建物件的原型物件
  • propertiesObject 可選,新增到新建物件的屬性(不是原型鏈的屬性),預設可列舉,引數對應Object.defineProperties的第二個引數

{} 相當於 Object.create(Object.ptototype), 現在你明白他們之間的區別了吧

for...in可以遍歷n的原型屬性

試了一下發現沒有列印toString\get\set方法屬性,後來才發現混淆了兩個概念,就是__proto__和prototype

這個__proto__屬性, 是一個物件的隱式原型,指向構造該物件的建構函式的原型

   function A() {
       console.log('我是函式A')
   };
   let a = new A();
   console.log(a.__proto__ === A.prototype)  // true
複製程式碼

這個以後再做深入討論。

ps。剛開始用md語法寫文件,用的還不是很熟練,以後有更多跟有內含的文章給大家分享,加油加油!