目录

🍎 JavaScript new 操作符相关

相关问题;

  • new 操作符的理解?

  • 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("Simon", 18)
console.log(person1)
person1.sayName() // "Simon"
1
2
3
4
5
6
7
8
9
10
11
12

这个例子中: new 通过构造函数 Person 创建出来的实例对象可以访问到构造函数中的属性;并且可以访问构造函数原型链中的属性,即 实例对象与构造函数通过原型链 连接起来

🌰 例子 / 构造函数拥有返回值:

function Test(name) {
  this.name = name
  return 1
}

const test = new Test("test")
console.log(test.name) // "test"
1
2
3
4
5
6
7

如果构造函数拥有返回值,并且返回值的类型是原始类型。但是这个返回值并没有作用。

但是如果 构造函数的返回值类型是一个对象

function Test(name) {
  this.name = name
  console.log(this.name)
  return {age: 18}
}

const test = new Test("Simon")
console.log(test) // {age: 18}
console.log(test.name) // undefined
1
2
3
4
5
6
7
8
9

如果构造函数的返回值为一个对象,那么返回值会被正常使用。即创建的实例对象都是这个返回值。

# new 的过程中做了什么?

主要完成以下工作:

  • 创建一个新的对象;

  • 将对象与构造函数通过原型链链接起来。

    将新对象的 [[prototype]] 指向为 构造函数.prototype

  • 根据构造函数的返回类型做判断,如果是原始值则会被忽略,如果是返回一个对象,需要正常处理。

b429b990-7a39-11eb-85f6-6fac77c0c9b3

# 手写模拟实现 new 操作符

function iNew(func, ...args) {
  // 创建一个新的对象
  const obj = {}
  // 连接原型
  obj.__proto__ = func.prototype
  // 将构造函数的 this 连接到新的对象
  let result = func.apply(obj, args)
  // 根据返回值判断
  return result instanceof Object ? result : obj
}
1
2
3
4
5
6
7
8
9
10

测试使用:

function Person(name, age) {
  this.name = name
  this.age = age
}

Person.prototype.sayName = function() {
  console.log(this.name)
}

let person = iNew(Person, "Simon", 18)
console.log(person)
1
2
3
4
5
6
7
8
9
10
11
📢 上次更新: 2022/09/02, 10:18:16