今天来聊一下new xx() 和 Object.create(xx)
【面试必问题】首先先来讨论下new xx()做了什么,请实现下new操作符
new 操作符
function setNew(F) {
const obj = {};
obj.__proto__ = F.prototype;
F.apply(obj);
return obj;
}
分析执行步骤:
- 新建一个新的空对象;
- 将新对象的原型链指向其构造函数的原型对象;
- 将构造函数的作用域赋值给新对象;(即 构造函数的this指向新对象);
- 返回新对象;
Object.create
function create2(base) {
const f = function() { };
f.prototype = base;
return new f();
}
分析执行步骤:
- 新建一个新的空函数;
- 将新函数的原型对象指向接受的参数本身;
- 返回该函数的实例;即实例.proto = base;
总结:
如果 base 是一个构造函数,那么采用Object.create创建的对象毫无意义;
如果 base是一个字面量对象或者实例对象,则相当于实现了对象的浅拷贝;