Popover API 实例展示 - 无JS的弹出层构建
使用原生HTML Popover属性创建提示、菜单与对话框,展示四种触发方式及样式定制。
UD5工具箱
交互式 Reflect API 速查与测试工具 — 选择方法,编辑参数,实时查看执行结果与等效代码。
Reflect 是 ES6 内置对象,提供与 Proxy handler 一一对应的静态方法,让对象操作更规范、更函数式。
| 方法 | 返回值 | 等效传统操作 | 说明 |
|---|---|---|---|
Reflect.get(target, key[, receiver]) | any | target[key] | 获取属性值,支持 receiver 代理 |
Reflect.set(target, key, value[, receiver]) | Boolean | target[key] = value | 设置属性值,返回是否成功 |
Reflect.has(target, key) | Boolean | key in target | 检查属性是否存在(含原型链) |
Reflect.deleteProperty(target, key) | Boolean | delete target[key] | 删除属性,返回是否成功 |
Reflect.defineProperty(target, key, desc) | Boolean | Object.defineProperty() | 定义属性,失败返回 false(而非抛错) |
Reflect.getOwnPropertyDescriptor(target, key) | Object|null | Object.getOwnPropertyDescriptor() | 获取自有属性的描述符 |
Reflect.ownKeys(target) | Array | Object.getOwnPropertyNames() + Symbol | 返回所有自有键(含 Symbol) |
Reflect.getPrototypeOf(target) | Object | Object.getPrototypeOf() | 获取原型对象 |
Reflect.setPrototypeOf(target, proto) | Boolean | Object.setPrototypeOf() | 设置原型,返回是否成功 |
Reflect.isExtensible(target) | Boolean | Object.isExtensible() | 检查对象是否可扩展 |
Reflect.preventExtensions(target) | Boolean | Object.preventExtensions() | 阻止扩展,返回是否成功 |
Reflect.apply(fn, thisArg, args) | any | fn.apply(thisArg, args) | 函数式调用,更安全 |
Reflect.construct(ctor, args[, newTarget]) | Object | new ctor(...args) | 构造实例,支持 newTarget |
Reflect 是 ES6(ECMAScript 2015)引入的内置对象(非构造函数),提供了一组静态方法用于操作对象。
它的设计目标:
Object、Function 上的操作集中到一个命名空间。Reflect.set() 返回 Boolean),而非抛出异常。Reflect.apply() 比 Function.prototype.apply() 更安全(不会被篡改)。| 特性 | Reflect | Object |
|---|---|---|
| 风格 | 函数式,返回成功/失败 | 命令式,失败时抛异常 |
| defineProperty | 返回 Boolean | 成功返回对象/失败抛 TypeError |
| setPrototypeOf | 返回 Boolean | 失败抛 TypeError |
| preventExtensions | 返回 Boolean | 返回目标对象 |
| ownKeys | 返回所有键(含 Symbol) | 需组合 getOwnPropertyNames + getOwnPropertySymbols |
| apply/construct | 提供函数式调用方式 | 无对应方法 |
Proxy 的 handler 方法与 Reflect 方法一一对应,最佳实践是在 Proxy 中使用 Reflect 转发默认操作:
const handler = {
get(target, key, receiver) {
console.log(`读取: ${String(key)}`);
return Reflect.get(target, key, receiver); // 转发默认行为
},
set(target, key, value, receiver) {
console.log(`设置: ${String(key)} = ${value}`);
return Reflect.set(target, key, value, receiver);
}
};
const proxy = new Proxy({}, handler);
使用 receiver 参数可以正确处理 getter/setter 中的 this 指向。
Reflect.set(target, key, value, receiver) 与 target[key] = value 的主要区别:
this,这在 Proxy 场景中至关重要。Reflect.ownKeys(target) 返回目标对象的所有自有键,包括:
对比:
Object.keys():仅返回可枚举的字符串键。Object.getOwnPropertyNames():返回所有字符串键(含不可枚举),但不含 Symbol。Object.getOwnPropertySymbols():仅返回 Symbol 键。Reflect.ownKeys():以上三者的并集,等同于 [...Object.getOwnPropertyNames(target), ...Object.getOwnPropertySymbols(target)]。Reflect.apply(fn, thisArg, args) 更安全:
fn.apply 可能被覆盖或修改(如果 fn 上有同名属性)。Function.prototype.apply 也可能被篡改。Reflect.apply() 直接调用底层操作,无法被拦截或篡改。语法更清晰:Reflect.apply(Math.max, null, [1, 2, 3]) 返回 3。
Reflect API 在所有现代浏览器中完全支持:
IE 11 及以下不支持。如果需兼容老旧浏览器,可使用 es6-shim 等 polyfill。对于绝大多数现代 Web 应用,Reflect API 可以放心使用。
Object.defineProperty() 在失败时(如不可扩展对象)会抛出 TypeError,需要用 try-catch 包裹。
Reflect.defineProperty() 只是返回 false,让错误处理更简洁:
// Object 方式 — 需要 try-catch
try {
Object.defineProperty(obj, 'x', { value: 1 });
} catch (e) { /* 处理错误 */ }
// Reflect 方式 — 更优雅
if (!Reflect.defineProperty(obj, 'x', { value: 1 })) {
// 处理失败
}
使用原生HTML Popover属性创建提示、菜单与对话框,展示四种触发方式及样式定制。
输入 Emmet 缩写,实时显示展开后的 HTML 结构,学习高级 Emmet 技巧。
在同一数据上运行多种数组遍历方式,测量并比较它们的执行时间,辅助性能优化决策。
展示各种 HTML5 验证属性(required, pattern, min, max 等)和自定义验证消息的效果。
利用 `:target` 伪类创建无需JavaScript的弹窗组件,支持关闭按钮和遮罩层。
对比 ES Module 和经典脚本的变量作用域、严格模式以及执行时机。
对简单混淆的JS进行格式化,并尝试将短变量名替换为更具描述性的名称,提高可读性。
在Emoji和它的JavaScript Unicode转义序列(如 \u{1F600})之间进行转换。
输入 HTML/CSS/JS 代码,在隔离沙箱中即时渲染,支持控制台捕获。
在单页内模拟MPA过渡效果,自定义进场/出场动画,体验View Transitions API丝滑切换。
向指定 URL 发送不同 HTTP 方法的请求,显示响应状态码、头部和主体,学习 RESTful API。
设置不同验证属性和自定义消息,测试HTML5表单验证触发效果。
生成实现点击锚点平滑滚动到目标位置所需的JS代码及CSS scroll-behavior。
定义字段名称和类型(姓名、邮箱、数字范围等),批量生成符合规则的 JSON 模拟数据。
设置浏览器标题和图标,模拟在暗色/亮色主题下标签栏的样子。
通过实例展示原生拖放 API 的使用,包括文件拖拽上传和页面元素排序功能。
展示一些常用内置HTML元素和自定义元素例子,提供代码复制。
将普通CSS代码转换为Styled Components的模板字符串格式。
粘贴代码自动进行语法高亮显示,支持主流编程语言,生成带行号的HTML代码块,方便嵌入博客。
设置总页数与当前页,生成数字式或省略式分页导航条。
将HTML代码转换为兼容React JSX的代码(class→className,style→对象等)。
输入最小/最大字体大小和视口范围,生成精确的 clamp() 值及回退方案。
向任意输入URL发送请求,清晰显示响应状态码、头信息和体,类似轻量级Postman。
生成形似iOS或Android的开关切换按钮,支持动画和自定义颜色。
绘制 SVG 路径,将动画元素绑定到路径上,生成 offset-path 动画代码。
执行各种属性修改,可视化显示哪些操作触发回流或重绘,帮助编写高性能代码。
粘贴自定义图标字体的Unicode,调节尺寸颜色立即查看效果。
定义端点、JSON响应体和延迟毫秒,模拟后端API供前端本地开发调试。
记录页面交互触发的所有DOM事件及其目标、冒泡阶段,以日志和瀑布形式展示。
输入CSS选择器和属性值,瞬间预览在当前页面元素上的效果(不改变实际样式)。