JavaScript中class方法默认不可枚举、可配置、可写,实例方法在prototype上,静态方法在构造函数上;需分别对Person.prototype或Person使用Object.getOwnPropertyDescriptors获取。

在 JavaScript 中,class 定义的方法默认是**不可枚举(non-enumerable)**、**可配置(configurable)**、**可写(writable)** 的,并且只存在于类的**原型对象(prototype)** 上(除静态方法外)。因此,想用 Object.getOwnPropertyDescriptors 获取类中定义的方法,必须明确作用目标——不是类本身,而是它的原型或构造函数的 prototype。
获取实例方法:查 class.prototype
class 中定义的普通方法(如 sayHello())会被添加到类的原型上。要获取它们的属性描述符,需传入 MyClass.prototype:
class Person {
constructor(name) {
this.name = name;
}
sayHello() {
return `Hello, ${this.name}`;
}
}
<p>// ✅ 正确:查原型对象
const descriptors = Object.getOwnPropertyDescriptors(Person.prototype);
console.log(descriptors.sayHello);
// {
// value: [Function: sayHello],
// writable: true,
// enumerable: false, // ← 关键:默认不可枚举
// configurable: true
// }获取静态方法:查类构造函数本身
静态方法(static)直接作为属性挂在类构造函数上,所以传入类名(即构造函数)即可:
class Person {
static createAdmin() {
return new Person('admin');
}
}
<p>// ✅ 正确:静态方法在构造函数对象上
const staticDesc = Object.getOwnPropertyDescriptors(Person);
console.log(staticDesc.createAdmin);
// {
// value: [Function: createAdmin],
// writable: true,
// enumerable: false,
// configurable: true
// }为什么直接对类或实例调用会失败?
- 对类(构造函数)本身调用:只拿到静态属性/方法,拿不到实例方法(因为实例方法不在构造函数自身上);
-
对实例对象调用:实例上没有方法(只有
this.name这类自有属性),方法都继承自原型,所以返回空对象{}; -
对
Person.prototype调用:这才是实例方法的“真实所在地”,能正确返回描述符。
小技巧:批量复制方法描述符
如果想把某个类的所有实例方法“复制”到另一个对象(比如做混入、代理),可以结合 Object.defineProperties:
立即学习“Java免费学习笔记(深入)”;
const target = {};
Object.defineProperties(
target,
Object.getOwnPropertyDescriptors(Person.prototype)
);
<p>// 现在 target 拥有了 sayHello 方法(但无 this 绑定)
target.sayHello.call({ name: 'Alice' }); // "Hello, Alice"


















