new操作符到底干了什么

187 阅读2分钟

一、new是什么

new命令的作用,就是执行构造函数,返回一个实例对象。

var Vehicle = function () {
  this.price = 1000;
};
​
var v = new Vehicle();
v.price // 1000

从上面可以看到:

  • 通过new命令,让构造函数Vehicle生成一个实例对象,保存在变量v中
  • new命令执行时,构造函数内部的this,就代表了新生成的实例对象
  • this.price表示实例对象有一个price属性,值是1000

使用new命令时,根据需要,构造函数也可以接受参数。

function Person(name, age){
    this.name = name;
    this.age = age;
}
Person.prototype.sayName = function () {
    console.log(this.name)
}
const person1 = new Person('Tom', 20)
console.log(person1)  // Person {name: "Tom", age: 20}
t.sayName() // 'Tom'

从上面可以看到:

  • new通过构造函数 Person 创建出来的实例可以访问到构造函数中的属性。
  • new通过构造函数 Person 创建出来的实例可以访问到构造函数原型链中的属性。

二、new命令的原理

使用new命令时,他后面的函数依次执行下面的步骤。

  1. 创建一个空对象,作为将要返回的对象实例。
  2. 将这个对象的原型,指向构造函数的prototype属性。
  3. 将这个空对象赋值给函数内部的this关键字。
  4. 开始执行构造函数内部的代码。

流程图如下:

1663900526595.png

三、手写实现new

function mynew(func,...args){
    const obj = {}; // 1.创建一个空对象
    obj.__proto__ = func.prototype; // 2.将这个空对象的原型指向Person.prototype
    let result = func.apply(obj,args); // 3. 将构造函数的this指向新对象,执行内部代码
    return result instanceof Object ? result: obj; // 4.根据返回值判断
}

测试一下:

function mynew(func, ...args) {
    const obj = {};
    obj.__proto__ = func.prototype;
    let result = func.apply(obj, args);
    return result instanceof Object ? result : obj;
}
function Person(name, age) {
    this.name = name;
    this.age = age;
}
Person.prototype.say = function () {
    console.log(this.name)
}
​
let p = mynew(Person, "kobe", 18)
console.log(p) // Person {name: "kobe", age: 18}
p.say() // kobe

本文就这么多了,谢谢!