当前位置:首页 > JavaScript

js 实现反射

2026-02-02 02:40:08JavaScript

反射的基本概念

反射是指在运行时动态获取和操作对象属性和方法的能力。JavaScript 提供了多种方式实现反射功能,主要通过内置对象和方法实现。

获取对象属性

使用 Object.keys() 可以获取对象所有可枚举属性的键名数组:

const obj = { a: 1, b: 2 };
const keys = Object.keys(obj); // ['a', 'b']

Object.getOwnPropertyNames() 会返回对象所有属性(包括不可枚举属性):

const obj = {};
Object.defineProperty(obj, 'hidden', { value: true, enumerable: false });
const props = Object.getOwnPropertyNames(obj); // ['hidden']

检查属性存在性

in 操作符可以检查对象或其原型链上是否存在指定属性:

const obj = { a: 1 };
console.log('a' in obj); // true
console.log('toString' in obj); // true(继承自原型)

Object.prototype.hasOwnProperty() 只检查对象自身属性:

js 实现反射

const obj = { a: 1 };
console.log(obj.hasOwnProperty('a')); // true
console.log(obj.hasOwnProperty('toString')); // false

动态访问属性

使用方括号表示法可以动态访问属性:

const obj = { key: 'value' };
const propName = 'key';
console.log(obj[propName]); // 'value'

方法调用

可以通过字符串形式动态调用方法:

const obj = {
  greet: function(name) { return `Hello ${name}`; }
};
const methodName = 'greet';
console.log(obj[methodName]('World')); // 'Hello World'

修改对象结构

Reflect API 提供了更完整的反射操作:

js 实现反射

const obj = {};
Reflect.set(obj, 'key', 'value'); // 等价于 obj.key = 'value'
console.log(Reflect.get(obj, 'key')); // 'value'

原型操作

通过 Object.getPrototypeOf()Object.setPrototypeOf() 可以操作原型链:

const parent = { inherited: true };
const child = {};
Object.setPrototypeOf(child, parent);
console.log(Object.getPrototypeOf(child) === parent); // true

构造函数调用

使用 Reflect.construct() 可以动态调用构造函数:

class Person {
  constructor(name) { this.name = name; }
}
const instance = Reflect.construct(Person, ['Alice']);
console.log(instance.name); // 'Alice'

属性描述符操作

Object.getOwnPropertyDescriptor() 可以获取属性配置:

const obj = {};
Object.defineProperty(obj, 'readOnly', { value: 1, writable: false });
const desc = Object.getOwnPropertyDescriptor(obj, 'readOnly');
console.log(desc.writable); // false

标签: 反射js
分享给朋友:

相关文章

js实现tab选项卡切换

js实现tab选项卡切换

实现Tab选项卡切换的JavaScript方法 使用纯JavaScript实现Tab切换功能,可以通过监听点击事件动态切换内容显示状态。以下是两种常见实现方式: 基础DOM操作实现 // 获取所有…

链表实现js

链表实现js

链表的基本概念 链表是一种线性数据结构,由一系列节点组成,每个节点包含数据和一个指向下一个节点的指针(单向链表)或两个指针(双向链表)。与数组不同,链表在内存中非连续存储,插入和删除操作更高效,但随机…

js实现吸色

js实现吸色

使用Canvas实现吸色功能 通过Canvas的getImageData方法获取像素颜色数据。创建一个Canvas元素,将目标图像绘制到Canvas上,通过鼠标事件获取坐标对应的颜色值。 c…

js图片上传实现

js图片上传实现

图片上传的基本实现 使用HTML的<input type="file">元素配合JavaScript的File API实现基础图片上传功能。HTML部分需要设置accept="image/…

js实现 拖动

js实现 拖动

实现拖动的步骤 HTML 结构 创建一个可拖动的元素和一个放置区域: <div id="draggable" draggable="true">拖动我</div> <d…

js实现上传图片

js实现上传图片

使用HTML5的File API实现图片上传 HTML5的File API允许通过JavaScript访问用户选择的文件。需要创建一个文件输入元素,并监听其change事件。 <input t…