实现new
-
1、创建一个新对象,将对象的原型指向构建函数的原型对象上
-
2、将构造函数的作用域赋给新对象(因此this就指向了这个新对象)
-
3、执行构造函数中的代码(为这个新对象添加属性)
-
4、返回新对象
- Object.create(proto) , 第一个参数是原型对象
- Object.create()可以返回新对象,使用指定的对象创建新对象的原型
Object.create 方法, 第一个参数是原型对象,以这个原型对象 作为指定的对象来创新新对象的原型
- Object.create(proto) , 第一个参数是原型对象
function myNew(fn, ...args) {
//1.创建一个对象并将obj的原型指向构造函数的原型对象上
//(实例对象的原型__proto__指向它所在的构造函数的原型对象prototype)
let obj = Object.create(fn.prototype);
//2.如果构造函数有返回值,则返回;否则,就会默认返回新对象。
let result = fn.call(obj, ...args);
//3.我们要判断result是不是object类型,如果是object类型,那么就返回result,否则,返回obj
//{},[],function 都属于Object对象
return result instanceof Object? result : obj;
}