new

59 阅读1分钟

new的原理?

  1. 创建一个新对象;

  2. 将构造函数的作用域赋给新对象(this 指向新对象);

  3. 执行构造函数中的代码(为这个新对象添加属性);

  4. 返回新对象。

    function Person(){

    this.name = 'Jack';

    }

    var p = Person();

    console.log(p) // undefined

    console.log(name) // Jack

    console.log(p.name) // 'name' of undefined

没有使用 new 这个关键词,返回的结果就是 undefined。其中由于 JavaScript 代码在默认情况下 this 的指向是 window,那么 name 的输出结果就为 Jack,这是一种不存在 new 关键词的情况。

function Person(){

   this.name = 'Jack'; 

   return {age: 18}

}

var p = new Person(); 

console.log(p)  // {age: 18}

console.log(p.name) // undefined

console.log(p.age) // 18

当构造函数最后 return 出来的是一个和 this 无关的对象时,new 命令会直接返回这个新对象,而不是通过 new 执行步骤生成的 this 对象。

function Person(){

   this.name = 'Jack'; 

   return 'tom';

}

var p = new Person(); 

console.log(p)  // {name: 'Jack'}

console.log(p.name) // Jack

当构造函数中 return 的不是一个对象时,那么它还是会根据 new 关键词的执行逻辑,生成一个新的对象(绑定了最新 this),最后返回出来。

所以new关键词执行之后总是会返回一个对象,要么是实例对象,要么是return语句指定的的对象。

function _new(ctor, ...args) {

    if(typeof ctor !== 'function') {

      throw 'ctor must be a function';

    }

    let obj = new Object();

    obj.__proto__ = Object.create(ctor.prototype);

    let res = ctor.apply(obj,  [...args]);



    let isObject = typeof res === 'object' && res !== null;

    let isFunction = typeof res === 'function';

    return isObject || isFunction ? res : obj;

};