关于JS的new操作符

119 阅读1分钟

使用new操作符的时候发生了什么?

当使用new操作符调用一个构造函数的时候主要做了以下事情

  1. 创建一个空对象,并将空对象的__proto__与构造函数的原型联系起来
  2. 将构造函数的this指向这个新创建的空对象
  3. 根据执行这个构造函数返回的结果,来确定new操作符返回什么,如果执行构造函数后返回的是一个引用类型,那么new操作符返回这个引用类型,否则返回新创建的这个对象

简单实现一个new操作符

function myNew() {
            let constructor = [].shift.call(arguments),
                // 创建一个新对象,将对象的__proto__指向构造函数的原型
                obj = Object.create(constructor.prototype);
            // 将构造函数的this指向新创建的对象obj,然后将参数传递进去
            let result = constructor.call(obj, ...arguments);
            // 判断执行构造函数然后的结果是否是对象,如果是对象则返回这个对象,那么就意味着,整个构造函数失效,返回整个引用值类型,否则返回这个新构建的对象
            return typeof result === 'object' ? result : obj;
        }

测试一下

       function Person(name, age) {
            this.name = name;
            this.age = age;
        }
        Person.prototype.say = function () {
            console.log(this.age, this.namse);
        };
        let p1 = myNew(Person, "张三", 18);
        console.log(p1.name);
        console.log(p1);
        p1.say();