Skip to content

Latest commit

 

History

History
71 lines (58 loc) · 1.73 KB

Object.create.md

File metadata and controls

71 lines (58 loc) · 1.73 KB

Object.create实现

描述

实现一个create函数,功能与Object.crteate相同。如:

let obj = {
  name: 'Orange',
  sayName () {
    console.log(`我是${this.name}`);
  }
}
let man = create(obj);
man.name = 'AAA';
obj.sayName(); // 打印 我是Orange
man.sayName(); // 打印 我是AAA

三行代码简易实现

const create = (proto) => {
  const F = function () {};
  F.prototype = proto;
  return new F();
}

这三行已经实现了Object.create的最基础功能,但是与Object.create稍微有些区别:

  1. 参数类型检查;
  2. Object.create拥有第二个参数,也就是属性操作符;
  3. 对于Object.create(null)返回的对象的__proto__属性也是null。

所以完整的实现还应对上面三种做特殊处理。

完整实现

步骤:

  1. 判断类型不是object或者function抛出异常;
  2. 定义构造器函数,其原型指向第一个参数,并创建对象;
  3. 如果有第二个参数则使用Object.defineProperties定义属性操作符;
  4. 如果第一个参数是null,则修复obj.__proto__指向null;
  5. 返回创建的对象。
const create = (proto, properties) => {
  // 不是函数或者对象抛出错误
  if (![ 'object', 'function' ].includes(typeof proto)) {
    throw new TypeError(`Object prototype may only be an Object or null: ${proto}`)
  }
  // 创建构造函数
  const F = function () {};
  // 构造函数的原型指向对象
  F.prototype = proto;
  // 创建实例对象
  const obj = new F();
  // 支持第二个参数
  if (properties) {
    Object.defineProperties(obj, properties);
  }
  // 支持空原型
  if (proto === null) {
    obj.__proto__ = null;
  }

  return obj
}