new实现原理
2020-03-29 本文已影响0人
姜治宇
假如让你实现一个new的功能,首先我们需要搞清楚:
new关键字都做了什么工作?
function Person(name){
this.name = name
}
var p = new Person('jack')
console.log(p)
在浏览器控制台打印一下结果:
new.jpg
从结果来看,new肯定是返回了一个object对象,而且这个对象必须具有原型指针proto和属性name两个东西。
我们可以先new一个空白的对象出来:
function myNew(){
let obj = new Object()
console.log(obj)
}
myNew()
打印结果:
obj.jpg我们首先看proto指针,干净的object对象,proto肯定是指向Object原型了,这是最根上的,而new出来的新对象,proto指向的是Person原型。
function myNew(){
let obj = new Object()
let func = [].shift.call(arguments)//出列,获取第一个参数
obj.__proto__ = func.prototype //proto指向原型
return obj
}
console.log(myNew(Person,'jack'))
看一下结果:
compare.jpg
差不多了,还差一个name属性没进来。我们需要在干净的object上增加一个name属性,这个很容易,只需改变一下Person函数的this指向即可。
function myNew(){
let obj = new Object()
let func = [].shift.call(arguments)//出列,获取第一个参数
obj.__proto__ = func.prototype //proto指向原型
func.apply(obj,arguments)//修改this指向
return obj
}
console.log(myNew(Person,'jack'))