当前位置:首页 > 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实现复制

js实现复制

使用document.execCommand方法 在较旧的浏览器中,可以使用document.execCommand('copy')实现复制功能。创建一个临时的textarea或input元素,将需要…

js 进度条的实现

js 进度条的实现

使用 HTML 和 CSS 创建基础进度条 HTML 结构可以简单使用一个 div 元素作为容器,内部嵌套另一个 div 表示进度: <div class="progress-containe…

原生js实现轮播图

原生js实现轮播图

基本结构搭建 HTML部分需要包含轮播图容器、图片列表及导航按钮。结构示例如下: <div class="slider-container"> <div class="slid…

js实现图片放大缩小

js实现图片放大缩小

实现图片放大缩小的基础方法 使用CSS的transform: scale()属性可以快速实现图片的放大缩小效果。通过JavaScript动态修改该属性值: const img = document.…

js 实现vue

js 实现vue

Vue.js 的基本实现 在 JavaScript 中实现 Vue.js 的核心功能,可以通过数据绑定、响应式系统和虚拟 DOM 来实现。以下是实现 Vue.js 核心功能的简化版本。 数据响应式系…

js类实现

js类实现

使用类实现 JavaScript 功能 在 JavaScript 中,类(Class)是一种语法糖,基于原型继承机制。通过 class 关键字可以更直观地定义对象模板。 基本类定义 class…