詳解Object.create(null)與Object.create({})

Object.create()的定義

參數

Object.create(proto,[propertiesObject])
proto:新建立對象的原型對象
propertiesObject:可選。要添加到新對象的可枚舉(新添加的屬性是其自身的屬性,而不是其原型鏈上的屬性)的屬性。es6

返回值

一個新對象,帶着指定的原型對象和屬性。app

實例

const person = {
  isHuman: false,
  printIntroduction: function () {
    console.log(123);
  }
};

const me = Object.create(person,{
  // foo會成爲所建立對象的數據屬性,且foo必須爲一個對象;可設置新對象的foo屬性的可讀性,可配置性以及值
  foo: { 
    writable:true,
    configurable:true,
    value: "hello" 
  }
  });

me.name = "Matthew"; // "name" is a property set on "me", but not on "person"
me.isHuman = true; // inherited properties can be overwritten
console.log(me)

new Object()

經過構造函數來建立對象, 添加的屬性是在自身實例下。
Object.create() es6建立對象的另外一種方式,能夠理解爲繼承一個對象, 添加的屬性是在原型下。:函數

var a = {  rep : 'apple' }
var b = new Object(a)
console.log(b) // {rep: "apple"}
console.log(b.__proto__) // {}

Object.create()

var a = { rep: 'apple' }
var b = Object.create(a)
console.log(b)  // {}
console.log(b.__proto__) // {rep: "apple"}

Object.create(null)與Object.create({})仍是有區別的

先看看咱們常用的{}建立的對象是什麼樣子的spa

var o = {a:1};
console.log(o)

再看看使用Object.create()建立對象:prototype

var o = Object.create(null,{
    a:{
           writable:true,
        configurable:true,
        value:'1'
    }
})
console.log(o)

咱們再把上面的例子改成{}3d

var o = Object.create({},{
    a:{
           writable:true,
        configurable:true,
        value:'1'
    }
})
console.log(o)

建立的對象和使用{}建立對象已經很相近了,可是仍是有一點區別:多了一層proto嵌套。
咱們最後再來改一下:code

var o = Object.create(Object.prototype,{
    a:{
           writable:true,
        configurable:true,
        value:'1'
    }
})
console.log(o)

相關文章
相關標籤/搜索