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'}
相关文章
相关标签/搜索