class方法是es6语法糖,本质为向prototype添加函数属性,必须用speak(){}形式定义,禁止加function关键字或冒号语法,constructor同理。

因为 Class 方法是 ES6 引入的语法糖,本质就是为 prototype 添加函数属性,语言层直接约定“写在 class 大括号里的、带括号的标识符”就是方法,不需要也不允许加 function 关键字。
这是语法层面的明确规定
JavaScript 类语法要求:类体中所有非静态、非 getter/setter 的普通方法,必须采用简洁形式定义——即 方法名() { ... }。加上 function 会直接报错(SyntaxError),不是省略问题,而是语法规则禁止。
- ✅ 正确:
speak() { return this.name + ' barks'; } - ❌ 错误:
function speak() { return this.name + ' barks'; } - ❌ 错误:
speak: function() { ... }(那是对象字面量写法,不适用于 class 体)
背后对应的是原型方法机制
class 并不是全新机制,它只是构造函数的语法包装。你写的每个实例方法,最终都会被添加到类的 prototype 上,等价于手动操作 MyClass.prototype.method = function() {...}。所以语言设计者让写法更贴近“这是属于这个类的行为”,而不是暴露底层函数赋值细节。
-
class Dog { bark() { } }→ 实际等效于Dog.prototype.bark = function() { }; - 构造器
constructor是唯一显式用 function 意图的地方,但它本身也遵循同样规则——不能写成function constructor() { }
和对象字面量写法有本质区别
有人会联想到对象里可以写 method() { } 或 method: function() { },但 class 不同:它不接受冒号语法,也不接受 function 表达式。这种强制统一,是为了明确区分“类定义”和“普通对象”,避免混淆继承链、this 绑定逻辑和静态/实例上下文。
- 对象字面量支持多种写法:
{ fn() {}, fn: function() {} } - class 只接受一种:
class X { fn() {} }—— 这是硬性规范,不是风格建议
constructor 也是方法,同样不加 function
构造函数 constructor 看似特殊,但它在语法地位上和其他实例方法一致:不加 function、不加分号、不可枚举、自动成为 prototype 的 constructor 属性。它只是被 new 调用时自动执行,并非语法上的例外。
- ✅
constructor(name) { this.name = name; } - ❌
function constructor(name) { ... }(语法错误) - ❌
constructor: function(name) { ... }(会被当作普通属性,失去构造器功能)











