我的最新博客地址:我的最新博客
想要实现new操作符,首先得知道new操作符干了哪些事情:
第一、new操作符会创建一个对象并返回,且此对象的__proto__
等于此函数的原型prototype
(这里需要注意__proto__
和prototype
的区别和联系,原型prototype
是函数才有的,务必记住,而__proto__
可以理解为对象的某个属性,此属性指向对象的构造函数的prototype,是不是很绕。举个例子);
比如,new函数A创建了对象a,则a.__proto__ = A.prototype
,代码如下:
function A(age) {
this.age = age
}
const a = new A(18)
console.log(a.__proto__ === A.prototype)
// true
第二、函数体中的this指向new操作符所创建的对象;
第三、如果此函数的返回值为对象,则函数的返回值则为函数体中所写的返回值,否则new操作符则创建一个对象并返回;
弄清楚了这三件事,下面就可以入手开始实现自己的new了:
function myNew(fn, ...args) {
const obj = Object.create(fn.prototype)
const res = fn.apply(obj, args)
return typeof res === 'object' ? res : obj
}
有更好的写法,欢迎指出。