「JavaScript深入」聊一聊 new操作符具体干了什么?

JavaScript深入 — new操作符


在这里插入图片描述

概念

在JavaScript中,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 创建出来的实例可以访问到构造函数原型链中的属性(即实例与构造函数通过原型链连接了起来)

👇 构造函数中返回一个原始值,然而这个返回值并没有作用

function Test(name) {
  this.name = name
  return 1
}
const t = new Test('xxx')
console.log(t.name) // 'xxx'

👇 构造函数如果返回值为一个对象,那么这个返回值会被正常使用

function Test(name) {
  this.name = name
  console.log(this) // Test { name: 'xxx' }
  return { age: 26 }
}
const t = new Test('xxx')
console.log(t) // { age: 26 }
console.log(t.name) // 'undefined'

流程

new 关键字的流程如下:

  • 创建一个新的对象 obj

    //创建一个新的空对象
    {}
    
  • 将对象与构造函数通过原型链连接起来

    //将新对象的[[prototype]]指向为Person.prototype
    {
      __proto__ = Person.prototype;
    }
    
  • 将构造函数中的this绑定到新建的对象 obj

    //将Person构造函数的this设置为新创建的对象,执行
    {
      __proto__ = Person.prototype;
      name = 'Tom';
      age = 20;
    }
    
  • 根据构造函数的返回类型作判断,如果是原始值则被忽略,如果返回对象,需要正常处理

    //构造函数Person没有return对象的话,将该新创建的对象返回
    const person = {...}
    

👻 具体流程图如下:

在这里插入图片描述


手写new操作符

function myNew(Func, ...args) {
  //创建一个新对象
  const obj = {};
  //新对象原型指向构造函数原型对象
  Object.setPrototypeOf(obj, Func.prototype);
  //将构建函数的this指向新对象
  const result = Func.apply(obj, args);
  //根据返回值判断
  return result !== undefined ? result : obj;
}

👇 测试代码

function Person(name, age) {
  this.name = name;
  this.age = age;
}
Person.prototype.say = function () {
  console.log(this.name);
};

let p = myNew(Person, "huihui", 123);
console.log(p); // Person {name: "simon", age: 123}
p.say(); // simon
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值