类的构造函数有prototype属性,其非静态方法作为可枚举属性存于该prototype上;方法本身是普通函数,无prototype属性。

JavaScript中类的方法定义本身没有 prototype 属性,但类的**构造函数**(即类名本身)有 prototype 属性,而类中定义的**普通方法会作为该 prototype 上的可枚举属性存在**。
类的方法存储在原型对象上
使用 class 语法定义的方法(非静态方法),会被自动添加到类的 prototype 对象中,而不是挂载在实例上。这意味着所有实例共享这些方法,符合原型继承机制。
- 类声明会创建一个函数对象(构造函数),该函数对象拥有
prototype属性; - 类体中定义的非静态方法(如
sayHello())会被添加为该prototype的自有属性; - 可通过
MyClass.prototype.sayHello直接访问该方法。
方法定义本身不是函数构造器,没有 prototype
类中的方法是普通函数表达式(或简写形式),属于“普通函数”,而非“构造函数”。因此它们自身不具有 prototype 属性(除非显式赋值,但这非常规且无意义)。
-
typeof MyClass.prototype.sayHello === 'function'成立; -
MyClass.prototype.sayHello.prototype是undefined(非箭头函数也一样); - 只有用
function声明的函数(且未被标记为箭头函数或方法简写)才默认拥有prototype,用于支持new调用——而类方法不设计用于new。
静态方法和箭头函数方法例外
静态方法(static)直接挂在类构造函数上,不在 prototype 上;类体内定义的箭头函数方法(如果手动写成)会绑定到实例,不进入原型,也不可枚举。
立即学习“Java免费学习笔记(深入)”;
-
MyClass.staticMethod存在,但MyClass.prototype.staticMethod为undefined; - 若在 constructor 中写
this.fn = () => {},该函数属于实例,与prototype无关; - 类字段(
fn = () => {})同理,不进入原型链,也不可被继承。
验证方式
可以这样快速验证:
class Person {
constructor(name) {
this.name = name;
}
greet() {
return `Hi, ${this.name}`;
}
}
console.log(Person.prototype.greet); // ✅ 函数本身
console.log(typeof Person.prototype.greet); // "function"
console.log(Person.prototype.greet.prototype); // undefined
console.log(Person.greet); // ❌ undefined(非静态)
不复杂但容易忽略:类方法的本质是原型方法,它们的“归属地”是类的 prototype,而不是方法自身携带 prototype。










