类✅
ES6 class 的基本语法与特性
答案
ES6 class 提供了更清晰、更接近传统面向对象语言的语法来创建对象和处理继承。基本特性包括:
- 使用
class
关键字定义类,constructor
方法用于初始化实例。 - 方法定义在类的原型上,所有实例共享。
- 支持继承(
extends
)、父类构造函数调用(super
)。 - 类本身和方法默认严格模式,类不能被提升。
class Animal {
constructor (name) {
this.name = name
}
speak () {
return `${this.name} makes a noise.`
}
}
class Dog extends Animal {
speak () {
return `${this.name} barks.`
}
}
const d = new Dog('Tommy')
console.log(d.speak()) // Tommy barks.
答案解析
class 语法让 JS 面向对象代码更直观,继承和原型链关系更清晰。
面试官视角
- 核心考察点:能否写出 class 基本用法和继承
- 评分标准:
- 差:只会 function 构造函数
- 良:能写出 class 和 extends
- 优:能结合 super、原型链说明
class 与传统构造函数的区别?
答案
- class 语法更简洁,类本身不可提升,必须用 new 调用。
- class 方法不可枚举,自动严格模式,原型链更清晰。
- 构造函数可被提升,方法需手动挂载到 prototype。
- class 支持 extends/super,继承语法更直观。
function Animal (name) {
this.name = name
}
Animal.prototype.speak = function () {
return this.name + ' makes a noise.'
}
const a = new Animal('Cat')
console.log(a.speak()) // Cat makes a noise.
答案解析
class 让继承和原型链更易理解,语法更接近主流面向对象语言。
面试官视角
- 核心考察点:能否说出 class 和构造函数的本质区别
- 评分标准:
- 差:只会用 class,不知区别
- 良:能说出语法和原型链差异
- 优:能结合继承和枚举性说明
class 的继承机制及 super 关键字作用?
答案
extends
用于实现子类继承父类,子类可访问父类方法和属性。super
在构造函数中调用父类构造函数,在方法中调用父类同名方法。- 子类构造函数必须先调用
super()
,否则 this 未定义。
class Parent {
constructor (name) { this.name = name }
greet () { return 'Hello, ' + this.name }
}
class Child extends Parent {
constructor (name, age) {
super(name)
this.age = age
}
greet () {
return super.greet() + ', age ' + this.age
}
}
const c = new Child('Tom', 10)
console.log(c.greet()) // Hello, Tom, age 10
答案解析
掌握 extends/super 是理解 JS 继承和原型链的关键。
面试官视角
- 核心考察点:能否正确使用 extends/super
- 评分标准:
- 差:不会用 super
- 良:能写出继承结构
- 优:能结合原型链和 super 说明
静态方法和实例方法的区别?
答案
- 静态方法用 static 关键字定义,只能通过类调用,不能被实例继承。
- 实例方法定义在类体内,无 static,实例可直接调用。
- 静态方法常用于工具函数、工厂方法等。
class Tool {
static add (a, b) { return a + b }
mul (a, b) { return a * b }
}
console.log(Tool.add(1, 2)) // 3
const t = new Tool()
console.log(t.mul(2, 3)) // 6
答案解析
区分静态方法和实例方法,能写出常见应用场景。
面试官视角
- 核心考察点:能否区分 static 和实例方法
- 评分标准:
- 差:混淆 static 用法
- 良:能写出静态方法
- 优:能举例说明用途
class 的私有属性和方法如何实现?
答案
ES2022 起可用 #
定义私有属性和方法,只能在类内部访问。
早期可用闭包或 Symbol 实现伪私有。
class Counter {
#count = 0
inc () { this.#count++ }
get value () { return this.#count }
}
const c = new Counter()
c.inc()
console.log(c.value) // 1
// console.log(c.#count) // SyntaxError
答案解析
私有字段提升了封装性,防止外部直接访问和修改。
面试官视角
- 核心考察点:能否写出私有属性
- 评分标准:
- 差:只会用 public
- 良:能用 # 定义私有
- 优:能结合封装说明