new发生了什么?

135 阅读1分钟

下载.jfif

new的四部曲

1、首先创建一个实例对象

2、然后让构造函数的this指向实例对象

3、让实例对象的__proto__指向构造函数的prototype

4、判断构造函数返回的是引用类型还是基本类型,如果返回的是引用类型,那么new出来的就是这个引用类型,如果返回的是基本类型,那么new出来的就是我们创建的实例。

实现一个new

代码如下:

 function mynew(fn,...arg){
            // 创建一个实例对象
            let obj = {};
            // 让实例对象的__proto__指向构造函数的prototyoe,(满足原型链的要求)
            obj.__proto__ = fn.prototype;
            // 改变this指向
            fn.apply(obj,arg)
            //判断返回的是不是引用类型
            let result = fn()
            return typeof(result)==='object'?result:obj
            // return Object.prototype.toString.call(result)==='[object Object]'?result:obj
        }

搞个题

function Foo(){
            this.a = 1;
            return {
                a:4,
                b:5
            }
        }
        Foo.prototype.a=6;
        Foo.prototype.b=7;
        Foo.prototype.c=8;
var o = new Foo;
        console.log(o.a);
        console.log(o.b);
        console.log(o.c);

答案是:4、5、undefined