首先来看一下new 之后生成了什么?
function Parent(name){
this.name = name;
}
Parent.prototype.age = 18;
let example = new Parent('child');
console.log(example.name,example.age);
实例example是一个对象,存在name属性,并且能访问原型上的age属性。
所以new的结果是返回了一个对象,并将构造函数的属性赋值到了对象当中,构造函数的原型属性或方法赋值到了对象的原型上。
那么new的过程其实就是如下几个步骤:
1、创建了一个空对象
2、设置这个对象的原型指向构造函数
3、执行构造函数,将构造函数中的this指向这个对象
4、返回这个对象
即:
function myNew(fn,...arg){
let obj = {};
obj.__proto__ = fn.prototype;
fn.call(obj,...arg);
return obj;
}
let example1 = myNew(Parent,'自定义new');
console.log(example1.name,example1.age)