Object.create 實現原理

Object.create

方法說明javascript

  1. Object.create()方法建立一個新的對象,並以方法的第一個參數做爲新對象的__proto__屬性的值(以第一個參數做爲新對象的構造函數的原型對象)
  2. Object.create()方法還有第二個可選參數,是一個對象,對象的每一個屬性都會做爲新對象的自身屬性,對象的屬性值以descriptor(Object.getOwnPropertyDescriptor(obj, 'key'))的形式出現,且enumerable默認爲false

源碼點撥java

搞清楚上面的方法描述說的意思,而後實現的時候實際上是比較簡單的,就是定義一個空的構造函數,而後指定構造函數的原型對象,經過 new運算符建立一個空對象,若是發現傳遞了第二個參數,經過Object.defineProperties爲建立的對象設置key、value,最後返回建立的對象便可

源碼函數

Object.myCreate = function (proto, propertyObject = undefined) {
  if (propertyObject === null) {
    // 這裏沒有判斷propertyObject是不是原始包裝對象
    throw 'TypeError'
  } else {
    function Fn () {}
    Fn.prototype = proto
    const obj = new Fn()
    if (propertyObject !== undefined) {
      Object.defineProperties(obj, propertyObject)
    }
    if (proto === null) {
      // 建立一個沒有原型對象的對象,Object.create(null)
      obj.__proto__ = null
    }
    return obj
  }
}

// 示例
// 第二個參數爲null時,拋出TypeError
// const throwErr = Object.myCreate({a: 'aa'}, null)  // Uncaught TypeError
// 構建一個以
const obj1 = Object.myCreate({a: 'aa'})
console.log(obj1)  // {}, obj1的構造函數的原型對象是{a: 'aa'}
const obj2 = Object.myCreate({a: 'aa'}, {
  b: {
    value: 'bb',
    enumerable: true
  }
})
console.log(obj2)  // {b: 'bb'}, obj2的構造函數的原型對象是{a: 'aa'}
相關文章
相關標籤/搜索