2

模拟js的new运算符的实现原理

我们知道,js里有一种创建对象的方式是通过显式的构造函数new出来一个实例化对象
但是 这个new运算符是怎么实现的呢?

先捋一遍new运算符的整个流程:
1: 创建一个新对象 它继承自构造函数的prototype
2:构造函数被执行 执行的时候 相应的传参会被传入,同时绑定上下文(this)
3:如果构造函数返回了一个'对象' 那么这个对象会取代整个new出来的结果。如果构造函数
    没有返回对象,那么new出来的结果为步骤1创建的新对象
<script>
        function Tiger(){
            this.name='泰哥';
            this.work='eat meat';
        }
        Tiger.prototype.tiger_dance = function(){
            console.log('dancing~~~~~~!');
        }
        var tigers = new Tiger();
            console.log(tigers);
     </script>
  
![图片描述][1]


接下来就手动实现一个new运算符:

 <script>
        var new2 = function(func){
            //创建一个空对象 并继承构造函数的原型对象
            var o = Object.create(func.prototype);
            //执行构造函数func 并改变func的this为o对象的
            var k = func.call(o);
            //判断构造函数func执行完的结果是不是对象类型
            if(typeof k === 'object'){
                return k;
            }else{
                return o;
            }
        }

        function Funky(){
            this.name='泰哥';
            this.work='eat meat';
        }
        Funky.prototype.funky_dance = function(){
            console.log('dancing~~~~~~!');
        }
        var funkys = new2(Funky);
            console.log(funkys);
    </script>
   
![图片描述][2]

可以看到 Funky的实例化对象funkys 已经有了构造函数Funky本身的属性并且也继承了Funky原型链上的方法
并且 funkys.__proto__ === Funky.prototype
至此,我们已经简单的实现了new运算的功能 是不是蛮简单~

Funky_Tiger
443 声望33 粉丝

刷题,交流,offer,内推,涨薪,相亲,前端资源共享...