面试之对new操作符的理解

251 阅读1分钟

讲讲对new的理解

当一个实例对象被new出来后,这个实例对象能做什么呢?

  • 实例对象能够访问构造函数的prototype对象
  • 实例对象拥有构造函数的属性

new操作符的执行过程:

  • 创建新的空白对象
  • 将构造函数的prototype对象设为新对象的原型(实例对象能够访问构造函数的prototype对象👌)
  • 将构造函数的this指向新对象,在新对象上执行构造函数的代码,利用构造函数.call(新对象,参数)实现 (实例对象拥有构造函数的属性👌)
  • 判断返回值的类型,如果是基本类型,则返回这个对象,如果是引用类型,则返回这个引用类型的对象

new操作符的实现代码:

function myNew (constructor, ...args) {
    // 1.obj 继承构造函数原型上的属性
    let obj = Object.create(constructor.prototype);

    // 2.obj 拥有构造函数的属性(obj 执行constructor就可以了)
    let res =  constructor.call(obj, ...args);
   
    // 3. 返回值:如果是引用类型,返回res,如果是基本类型,返回obj
    return res instanceof Object ? res : obj;
}

// 测试代码
function Person(name){
    this.name = name;
}
Person.prototype.sayName = function(){
    console.log(this.name);
}

let p1 = new Person("new xiaomi");
console.log(p1);
p1.sayName();
let p2 = myNew(Person,"myNew xiaomi")
console.log(p2);
p2.sayName();