美文网首页
手写new关键字

手写new关键字

作者: 变量只提升声明不提升赋值 | 来源:发表于2020-12-23 15:08 被阅读0次
    //先来准备一个构造函数
    function dog(name) {
            this.name = name
        }
    dog.prototype.sayName = function () {
            console.log(this.name)
        }
    
    
    //接下来去写new关键字的处理函数
    
    
    
        function newobj(fn,...param) {
            //首先这个函数接收两个参数,第一个参数就是构造函数,第二个参数就是构造函数所要接收的参数,也就是上文中的name
            let obj = Object.create(fn.prototype) 
                //使用Object.create方法创建一个对象,
                //并把构造函数的原型(fn.prototype)传进去代表 用当前对象的原型去创建
            fn.call(obj,...param)
              //这里就可以调用fn函数进行对象的初始化了,同时使用call方法去改变当前函数中this的指向,使他指向新创建的对象
              //现在dog函数中的this指向的就是obj这个对象了,然后我们将接收到的参数传进去,最后返回这个obj
            return obj
        }
    
       let obj2 =  newobj(dog,'小狗')
        console.log(obj2)
        obj2.sayName()
    
    image.png

    可以看到obj2这个对象里有了name这个属性,并且他的原型上也有sayName这个函数,调用这个函数也没有问题。这就是new关键字做的事情

    相关文章

      网友评论

          本文标题:手写new关键字

          本文链接:https://www.haomeiwen.com/subject/heaynktx.html