二义性

一个普通函数有两种使用方式:

1
2
3
function a() {}
a() // 调用
new a() // 实例化

这样就会产生问题:这个函数,什么时候该调用,什么时候该实例化?

开发者有一套自定规范:小驼峰命名法的函数用于调用;大驼峰命名法的函数用于实例化,但这毕竟只是村规,该不严谨照样不严谨

new运算符其实就是在获取以函数自身的属性构成的对象,也就是函数的this

1
2
3
4
5
6
7
8
9
10
11
12
13
function a() {
this.name = 'yajue'
this.age = 24
console.log(this)
}
// console.log(a()) // 报错
console.log(new a()) // -> {name: 'yajue', age: 24}

function a2() {
console.log(this)
}
console.log(a2()) // -> undefined
console.log(new a2()) // -> {}

函数自身的this等于函数new出的最新一个实例,而旧的实例会变成其副本

1
2
3
4
5
6
7
8
9
10
11
12
13
let aaa 
function a() {
this.name = 'yajue'
this.age = 24
console.log(this)
aaa = this
}

let bbb = new a()
let ccc = new a()
console.log(aaa === bbb) // -> false
console.log(aaa === ccc) // -> true
console.log(bbb === ccc) // -> false

箭头函数和类

ES6引入的箭头函数和类,其中一个意义就是能消除ES5函数的二义性

众所周知,箭头函数中的this指向上下文而不是函数自己的属性、所以箭头函数不能创建自身属性,不能被实例化

此外,箭头函数没有prototype、arguments、super等属性,不能展现继承关系等

所以把实例化交给类吧,它有