web前端

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'))
上一篇下一篇

猜你喜欢

热点阅读