手写new方法
new方法大家一定不陌生,在创建一个对象时经常会使用new方法,今天我们试着自己封装一个new方法。
先拿出需要new的函数,也就是构造函数
function AA(name, age) {
this.name = name
this.age = age
}
分析:
- 创建出来的对象首先需要有构造函数里面的属性,也就是说我们应该执行构造函数,将值赋给新对象。这个时候就可以使用apply或者是call方法。(其实选择apply和call也是有讲究的。apply对于参数的书写无疑更加简单,但是他的内部其实也是执行了call方法,只不过增加了将数组参数拆开的过程,所以就性能而言,call永远比apply更快!)
2.其次除了属性之外,构造函数创建出来的实例,实例的原型应该指向的是构造函数的prototype属性。
3.当构造函数返回了一个引用类型,那new出来的数据就会是该引用类型(不包含函数),若不是,则返回创建的实例。
开始封装
function myNew(fn, ...arg) {
if(typeof fn !== 'function') return
let obj = Object.create(fn.prototype)
let res = fn.call(obj, ...arg)
return res instanceof Object ? res : obj
}
就是如此简单!
注意这个方法不支持class形式