1.流程
- 创建一个全新的对象
- 将这个对象的
[[Prototype]]链接到构造函数的prototype属性 - 将新对象作为
this上下文执行构造函数 - 如果构造函数返回一个对象,则返回该对象;否则返回新创建的对象
2.代码
function newFunc(func,...args){// 检查构造函数是否为函数if (typeof func !== 'function') {throw new TypeError('func must be a function');}//1创建对象const obj={};// 2原型设置Object.setPrototypeOf(obj,func.prototype);// 或者// obj.__proto__=func.prototype;// 1和2可以直接使用Object.create(func.prototype);创建一个空对象,且proto指向第一个参数// 3改变this指向const result = func.apply(obj,args);//apply改变this指向后原函数会立即执行,且此方法只是临时改变this指向一次// 4. 判断构造函数返回值是否为对象(非原始值、null)// 如果构造函数返回了一个对象,则返回该对象// 否则返回新创建的对象return result != null && typeof result === 'object' ? result : obj;}
由于无法解释的神圣旨意,我们徒然地到处找你;你就是孤独,你就是神秘,比恒河或者日落还要遥远。。。。。。