new 操作符
构造函数
构造函数其实也是常规函数,但是有两个约定。
- 命名时首字母大写(不是必须,是一个共同约定,明确表明函数将使用new执行)
- 只能用“new”操作符执行
js
function User(name) {
// this = {} 隐式创建
this.name = name
// return this 隐式返回
}
let user = new User('Tom')
console.log(user.name) // Tom
当一个函数执行new User(...)操作时,发生了什么?
- 创建一个空的简单JavaScript对象(即{})
- 链接该对象(即设置该对象的构造函数)到另一个对象
- 将步骤1新创建的对象作为this的上下文
- 如果该函数没有返回对象,则返回this
js
function User(name) {
this.name = name
}
let user = new User('Tom')
console.log(user.name) // Tom
// 隐式创建及返回
function User2(name) {
const obj = {}
obj.name = name
obj.__proto__ = User2.prototype
return obj
}
let user2 = new User2('Jack')
console.log(user2.name) // Jack
模拟实现 new
js
function _new(fn, ...args){
const obj = Object.create(fn.prototype)
const res = fn.apply(obj, args)
return res instanceof Object ? res : obj
}