一、将class转换为function
js
class Example {
constructor(name) {
this.name = name
}
func() {
console.log(this.name)
}
}
题解:
[60分答案]
jsfunction Example(name) { this.name = name } Example.prototype.func = function () { console.log(this.name) }
[70分答案]- 在es6里面使用类语法的话,整个里面的代码是在一个严格模式下边,所以要转换成普通函数构造函数,需要在第一行写上
use strict
js'use strict' function Example(name) { this.name = name } Example.prototype.func = function () { console.log(this.name) }
[80分答案]- 在es6里面,这个类虽然本质上是一个函数,但是这个函数有个特点,只能通过
new
来调用,不可直接调用,如果直接调用应该报Class constructor Example cannot be invoked without 'new'
js'use strict' function Example(name) { // 验证 this 指向 if(!(this instanceof Example)) { throw new TypeError(`Class constructor Example cannot be invoked without 'new'`); } this.name = name; } Example.prototype.func = function () { console.log(this.name) }
[90分答案]- 在在es6里面,这个类的方法是在原型上的,这是没有问题的,但是这个方法成员是不可被枚举的。
js'use strict' function Example(name) { // 验证 this 指向 if(!(this instanceof Example)) { throw new TypeError(`Class constructor Example cannot be invoked without 'new'`); } this.name = name; } Object.defineProperty(Example.prototype, 'func', { value: function () { console.log(this.name); }, enumrable: false })
[100分答案]- 在es6里面,这个类的方法本身不能被
new
,会报e.func is not a constructor
,但是在js
里面任何函数都是可以被new
js'use strict' function Example(name) { // 验证 this 指向 if(!(this instanceof Example)) { throw new TypeError(`Class constructor Example cannot be invoked without 'new'`) } this.name = name } Object.defineProperty(Example.prototype, 'func', { value: function () { // 不可通过 new 调用 if(!(this instanceof Example)) { throw new TypeError(`e.func is not a constructor`); } console.log(this.name); }, enumrable: false })