You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

JavaScript是否支持反射?如何获取对象继承的类列表?

JavaScript反射机制与继承类列表获取

JavaScript完全支持反射机制,Reflect API是ES6引入的专门用于反射操作的工具集,同时Object对象上的getPrototypeOf、keys等方法也属于反射范畴。

你的代码报错原因

你尝试获取DOM元素原型的name或nodeName时报错,核心原因有两点:

  • nodeName是DOM元素实例的属性,原型对象上并不存在,直接访问原型的nodeName自然会得到undefined或报错(严格模式下)。
  • DOM元素属于浏览器提供的宿主对象,这类对象的原型结构和原生JS对象不同,很多宿主原型不会暴露name属性,因此访问proto.name会报错。

获取对象继承的类列表

要获取一个对象的继承类列表,本质是遍历它的原型链,依次获取每个原型对应的构造函数名称。针对原生JS对象和DOM宿主对象,有不同的处理方式:

1. 原生JS对象的处理

对于自定义类或原生内置对象(如Array、Object),可以通过遍历原型链,结合constructor.name获取类名:

function getInheritanceChain(obj) {
  const chain = [];
  let currentProto = Object.getPrototypeOf(obj);
  
  while (currentProto !== null) {
    // 兼容构造函数name被修改或不存在的情况
    const className = currentProto.constructor?.name || 'Unknown';
    chain.push(className);
    currentProto = Object.getPrototypeOf(currentProto);
  }
  
  return chain;
}

// 测试:数组的继承链
const arr = [];
console.log(getInheritanceChain(arr)); // 输出: ["Array", "Object"]

2. DOM宿主对象的处理

DOM元素这类宿主对象的原型链结构更特殊,部分宿主原型的constructor.name可能无法直接获取,此时可以用Object.prototype.toString()来获取更可靠的类名:

function getDOMInheritanceChain(element) {
  const chain = [];
  let currentProto = Object.getPrototypeOf(element);
  
  while (currentProto) {
    // 通过toString方法解析类名,格式为"[object ClassName]"
    const className = Object.prototype.toString.call(currentProto).slice(8, -1);
    chain.push(className);
    currentProto = Object.getPrototypeOf(currentProto);
  }
  
  return chain;
}

// 测试:textarea元素的继承链
const textarea = document.createElement("textarea");
console.log(getDOMInheritanceChain(textarea));
// 通常输出: ["HTMLTextAreaElement", "HTMLElement", "Element", "Node", "EventTarget", "Object"]

补充说明

  • Reflect.getPrototypeOf(obj)和Object.getPrototypeOf(obj)功能一致,都是获取对象的原型,你可以根据习惯选择使用。
  • 部分老旧浏览器对宿主对象的原型链访问有限制,上述方法在现代浏览器(Chrome、Firefox、Edge等)中均可正常工作。

内容的提问来源于stack exchange,提问作者1.21 gigawatts

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.21 17:39:54