function 转 class

如何将下面的代码转换为普通构造函数的写法?

1
2
3
4
5
6
7
8
class Animal {
constructor(name) {
this.name = name
}
run() {
console.log(this.name + ' is running!')
}
}

有 4 点需要注意:

  • 严格模式
  • 构造函数只能通过 new 关键字创建,不能够直接调用
  • 属性方法不能够被枚举
  • 属性方法不能够通过 new 关键字创建
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
'use strict' // 1. 严格模式

function Animal(name) {
// 2. 只能通过 new 关键字创建,不能够直接调用
if (!new.target) {
throw new TypeError(`Class constructor ${this.constructor.name} cannot be invoked without 'new'`)
}
this.name = name
}

Object.defineProperty(Animal.prototype, 'run', {
value: function() {
// 4. 不能通过 new 关键字创建
if (new.target) {
throw new TypeError(`Animal.prototype.run cannot be invoked with 'new'`)
}
console.log(this.name + ' is running!')
},
// 3. 当前属性方法不能够枚举
enumerable: false
})