js new操作符的实现原理

2,288 阅读1分钟

一、关于new操作符

关于javascript继承,使用new操作符实例化构造函数,像这样 let obj = new Fn() 那么new调用类的构造函数会执行什么操作呢?今天来实现下new的原理。

二、模拟new的实现

我们先来定义一个构造函数:

function People(name) {
    this.name = name; //实例上的属性
}
People.prototype.say = function () {
    console.log('haha')
}
let ada = new People('ada');

console.log(ada.name); // 'ada'
ada.say(); // 'haha'

可以看到,使用new实现了子类继承父类People的属性和原型上的方法。那么接下来实现new

function myNew() {
    let Constructor = Array.prototype.shift.call(arguments) //1、通过参数shift方法取到Constructor
    let obj = {} ///2、在内存中定义一个新对象
    obj._proto_ = Constructor.prototype // 3、新对象的_proto_指针指向构造函数的prototype属性
    let r = Constructor.apply(obj,arguments); // 4、this指向新对象,并执行构造函数代码
}
let ada = myNew(People, 'ada')
console.log(ada)

三、总结

所以可以得到,使用new操作符调用类的构造函数会执行如下操作:

  1. 在内存中创建一个新对象
  2. 这个新对象内部的_proto_指针被赋值给构造函数的prototype属性
  3. 构造函数内部的this指向新对象
  4. 执行构造函数内部的代码
  5. 如果构造函数返回非空对象,则返回该对象;否则,返回刚创建的新对象