原生js模拟实现new操作符的功能

585 阅读1分钟

hi,大家好,我是一条狗。

function Dog() {}
var you = new Dog()

new 做了4件事:

function myNew(cons, ...args) {

    // A:创建一个新对象tempObj
    var tempObj = {}
    
    // B:把cons的prototype接到tempObj的原型链上
    tempObj = Object.create(cons.prototype)
    
    // C: 这一步有两个功能
    //	1、在tempObj的上下文环境中执行cons
    //	2、返回一个带着cons上下文的tempObj
    cons.apply(tempObj, args) 
    
    // D: 返回新对象
    return tempObj
}

// 更具包容性的参数处理方式:
function myNew() {
    var tempObj = Object.create(arguments[0].prototype)
    var arg = Array.prototype.slice.call(arguments, 1) // 切掉数组第一个成员
    arguments[0].apply(tempObj, arg)
    return tempObj
}

其实 tempObj = Object.create(cons.prototype) 可以理解为:

    tempObj.constructor = cons
    tempObj.__proto__ = cons.prototype

但这只是帮助我从原型链的角度去理解 Object.create() 的工作,MDN上说不建议修改对象的 __proto__ 值,因为性能很差。