总听说,程序员不却对象,需要的时候可以自己new一个出来,那么new这三个字母到底干了什么呢?
new操作符做了三件事:
(1)创建了一个共对象,将this指向了这个空对象
(2)执行构造函数,将传入的属性赋值给this
(3)为this对象设置原型为function.prototype,设置构造函数的contructor指向其构造函数本身
(4)返回this对象
那么如何实现一个new操作符呢?且看下面的代码:
function _new (fun) {
return function (...args) {
let obj = {} // 创建一个空对象
Object.setPrototypeOf(obj, fun.prototype) // 等同于obj.__proto__ = fun.prototype 赋予新对象原型
fun.prototype.constructor = fun // 将fun的原型的构造函数指向自己
let result = fun.apply(obj, args) //将参数赋值到新对象
return result === 'object' ? result : obj
}
}
function Animal (name, age) {
this.name = name
this.age = age
}
let ana = _new(Animal)('cat', 3)
console.log(ana)
_new函数实际就是new操作的神来之笔。学习的路还很长。