Open jtwang7 opened 3 years ago
参考文章:
new 运算符创建一个用户定义的对象类型的实例或具有构造函数的内置对象的实例。———— 摘自《MDN Web Docs》
简单理解,new 操作符会基于一个对象模版或构造函数,创建出一个对象实例。其中:
call
apply
function myNew (Fn, ...args) { // 步骤一 const _this = {}; // 步骤二 Reflect.setPrototypeOf(_this, Fn); // this.__proto__ = Fn.prototype; // 步骤三 const res = Fn.apply(_this, args); // 步骤四 return (res instanceof Object) ? res : _this; }
Object.create() 合并了创建对象和连接构造函数原型链的操作
Object.create()
function _new(Fn, ...args) { let _this = Object.create(Fn.prototype); // Object.create() 基于 Fn.prototype 原型创建空对象 let obj = Fn.apply(_this, args); // 基于 _this 空对象立即执行 Fn , 在 _this 上挂载 args 参数. Fn 可能有返回值, 创建一个 obj 变量接收 return obj instanceof Object ? obj : _this // 若返回值为对象, 则返回该对象, 否则返回 _this 对象, 这样就忽略了原始值 }
参考文章:
new 操作符的作用
简单理解,new 操作符会基于一个对象模版或构造函数,创建出一个对象实例。其中:
new 操作符的原理及实现
实现步骤
call
或apply
强绑定构造函数的 this 指向,并执行构造函数,在新对象上挂载构造函数内部定义的属性和方法 (使新对象可以调用构造函数自身定义的属性和方法);调用 Object.create() 的实现步骤
Object.create()
合并了创建对象和连接构造函数原型链的操作