js基础:new 对象发生了什么

老生常谈了

new 运算符创建一个用户定义的对象类型的实例或具有构造函数的内置对象的实例。new 关键字会进行如下的操作:

  • 创建一个空的简单 JavaScript 对象(即{});
1
var obj = {}
  • 设置原型链,将 obj 的proto成员指向了构造函数的 prototype
1
obj.__proto__ = xx.prototype
  • 将步骤 1 新创建的对象作为 this 的上下文 ;
1
let o = xx.call(obj)
  • 如果构造函数 return 了一个新的“对象”,那么这个对象就会取代整个 new 出来的结果。如果构造函数没有 return 对象,那么就会返回步骤 1 所创建的对象,即隐式返回 this
1
return o ? o : obj

完整版本

说明一下 Object.create 方法:Object.create 方法会创建一个新的空对象,该对象的原型指向传进来的参数。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
function newObject() {
var con = [].shift.call(arguments)
var obj = Object.create(con.prototype)
var res = con.apply(obj, arguments)
return res ? res : obj
}

function My(a) {
return {
a,
}
}
// 使用
const a = newObject(My, 1) // { a: 1 }

声明一个普通函数, 该函数返回一个基本类型, 或者返回函数, 这个时候会发生什么?

  • 函数返回基本类型,使用 new, 会生成空对象
  • 函数返回函数类型,使用 new, 返回该函数(函数本身也是对象)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
// 函数返回基本类型 -----------------
function func(a, b) {
return a + b
}

var c = new func(1, 2)
console.dir(c) // func{} func类型的空对象
Object.keys(c) // []

// 函数返回函数 ---------------------
function func() {
return function () {
return 22
}
}

var c = new func()
c() // 22