实现一个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
稍微有些区别:
- 参数类型检查;
Object.create
拥有第二个参数,也就是属性操作符;- 对于
Object.create(null)
返回的对象的__proto__
属性也是null。
所以完整的实现还应对上面三种做特殊处理。
步骤:
- 判断类型不是object或者function抛出异常;
- 定义构造器函数,其原型指向第一个参数,并创建对象;
- 如果有第二个参数则使用
Object.defineProperties
定义属性操作符; - 如果第一个参数是null,则修复
obj.__proto__
指向null; - 返回创建的对象。
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
}