new 都用过,用来创建实例对象,可new 操作背后都做了些什么
new 背后的操作
操作过程
function Hexo (value) {
this.name = value;
}
const hexo = new Hexo('张三');
第一步:
创建一个空对象那
const obj = {};
第二步:
链接该对象到另一个对象(原型链)
将obj的隐士原型设置为Hexo的原型
obj.__prop__ = Hexo.prototype;
第三步:
将步骤1新创建的对象作为 this 的上下文
将Hexo的this 修改为obj
const ref = Hexo.apply(obj, arguments);
第四步:
如果该函数没有返回对象,则返回this
return typeof ref === 'object' ? ref : obj;
代码:
function myNew () {
// 创建一个空的简单JavaScript对象(即{});
const obj = {};
// 取得该方法的第一个参数(并删除第一个参数),该参数是构造函数
const Constructor = [].shift.apply(arguments);
// 将新对象的内部属性__proto__指向构造函数的原型,这样新对象就可以访问原型中的属性和方法
obj.__prop__ = Constructor.prototype;
// 取得构造函数的返回值
let ref = Constructor.apply(obj, arguments);
// 如果返回值是一个对象就返回该对象,否则返回构造函数的一个实例对象
return typeof ref === 'object' ? ref : obj;
}
参考文章:
mdn: https://developer.mozilla.org/zh-CN/docs/Web/JavaScript/Reference/Operators/new
w3c: https://262.ecma-international.org/#sec-new-operator
掘金:https://juejin.cn/post/6844904112857825293