JSProxy无法拦截super调用原因解析
本篇文章主要是结合我之前面试的各种经历和实战开发中遇到的问题解决经验整理的,希望这篇《JavaScript 的 Proxy 无法直接拦截 super 关键字的方法调用。原因如下:1. super 是语言层面的语法super 是 JavaScript 中用于访问原型链上父类方法的关键字,它本质上是语法结构,而不是对象属性或方法调用。Proxy 只能拦截对象的属性访问、方法调用等操作,而不能拦截语言本身的语法行为。2. super 的调用方式不同于普通方法调用在类中使用 super.method() 时,JavaScript 引擎会直接查找当前类的原型链中的 method 方法,并且这个过程是静态解析的,不会经过对象的属性访问机制。因此,即使你对类的原型设置了 Proxy,也无法拦截 super 的调用。3. 示例说明 class Parent { greet() { console.log("Parent"); } } class Child extends Parent { greet() { super.greet(); // 这里的 super.greet() 不会被 Proxy 拦截 } } const proxy = new Proxy(Child.prototype, { get(target, prop, receiver) { console.log(`Accessing property: ${prop}`); return target[prop]; } }); const child = new Child(); child.greet(); // 输出 "Parent",但不会触发》对你有很大帮助!欢迎收藏,分享给更多的需要的朋友学习~
Proxy 无法拦截 super 调用,因为 super 在语言层面直接访问原型链上的方法,不经过对象属性查找机制,因此不会触发 get 或 apply 等 trap 捕获器;例如在类的继承中,super.greet() 直接从 Parent.prototype 查找方法,即使 Child.prototype 的原型被代理,也不会触发 Proxy 的捕获器;虽然无法直接拦截,但可通过代理父类原型间接影响 super 行为,如将 Parent.prototype 替换为 Proxy,在 get 中拦截方法调用并添加额外逻辑;这表明 super 的调用是静态解析且绕过代理机制的,只能通过修改原型链或代理父级原型实现间接控制。

JavaScript 的 Proxy 无法直接拦截 super 关键字的方法调用。
为什么 Proxy 不能拦截 super 调用?
因为 super 不是通过对象属性查找机制触发的。它在语言层面直接访问原型链上的方法,绕过了 Proxy 的 trap 捕获器(如 get 或 apply)。 当使用 super.method() 时,JavaScript 引擎会:- 静态确定当前方法所在的类或对象字面量
- 获取该对象的 [[Prototype]](即原型)
- 直接在原型上查找并调用 method
实际例子说明
看一个示例:const target = {
greet() {
return "Hello from target";
}
};
const handler = {
get(target, prop, receiver) {
console.log(`Access to ${prop}`);
return Reflect.get(...arguments);
}
};
const proxy = new Proxy(target, handler);
class Parent {
greet() {
return "Hello from Parent";
}
}
class Child extends Parent {
greet() {
// 这里 super.greet() 访问的是 Parent.prototype.greet
// 即使 this.__proto__ 可能被代理,super 仍然直接找 Parent.prototype
return super.greet() + ", then Child";
}
}
// 把 Child 实例的原型换成代理
Object.setPrototypeOf(Child.prototype, proxy);
const c = new Child();
console.log(c.greet()); // 输出: "Hello from Parent, then Child"
// 注意:没有触发 Proxy 的 get 捕获器
尽管 Child.prototype 的原型是 proxy,但 super.greet() 并未打印 "Access to greet",说明 get 没有被触发。
有没有间接方式影响 super 行为?
虽然不能直接拦截 super 调用,但可以通过修改原型链来间接影响:- 代理父类原型上的方法本身 —— 如果父类原型是 Proxy,可以捕获对它的调用
- 重写原型上的方法,在内部做额外逻辑
const parentProtoProxy = new Proxy(Parent.prototype, {
get(target, prop, receiver) {
if (prop === 'greet') {
return function(...args) {
console.log('Intercepted super.greet() call');
return Reflect.get(target, prop, receiver).apply(this, args);
};
}
return Reflect.get(...arguments);
}
});
// 让 Child 继承自被代理的原型
Object.setPrototypeOf(Child.prototype, parentProtoProxy);
这时调用 super.greet() 会经过代理,但这是代理了父类原型,而不是拦截 super 本身。
基本上就这些。Proxy 对 super 的调用无能为力,因为 super 是静态解析、直接访问原型的机制,不走常规的对象属性陷阱路径。想监控或修改 super 行为,只能从父级原型入手,而非靠代理子类或实例。
理论要掌握,实操不能落!以上关于《JSProxy无法拦截super调用原因解析》的详细介绍,大家都掌握了吧!如果想要继续提升自己的能力,那么就来关注golang学习网公众号吧!
HTML编辑器快捷键使用指南
- 上一篇
- HTML编辑器快捷键使用指南
- 下一篇
- JavaScript链表结构创建教程
-
- 文章 · 前端 | 2小时前 | 前端 · Web Components LiT 响应式更新 前端组件 updateComplete
- Lit updateComplete怎样等待组件更新结束
- 425浏览 收藏
-
- 文章 · 前端 | 5小时前 | D3 scaleBand scalePoint d3-scale
- D3 scaleBand与scalePoint适用场景有什么区别
- 271浏览 收藏
-
- 文章 · 前端 | 5小时前 | 响应式 副作用 SolidJS createMemo createEffect
- SolidJS createMemo为什么不适合执行副作用
- 308浏览 收藏
-
- 文章 · 前端 | 5小时前 |
- SolidJS store嵌套字段怎样局部更新
- 130浏览 收藏
-
- 文章 · 前端 | 6小时前 |
- XState父状态机怎样向子actor发送事件
- 191浏览 收藏
-
- 文章 · 前端 | 6小时前 |
- Alpine.js $nextTick怎样等待DOM更新
- 367浏览 收藏
-
- 文章 · 前端 | 6小时前 |
- htmx局部替换时怎样保留指定元素状态
- 241浏览 收藏
-
- 文章 · 前端 | 6小时前 |
- htmx hx-sync怎样避免表单与字段请求竞争
- 390浏览 收藏
-
- 文章 · 前端 | 6小时前 | Property Web Components LiT Attribute 响应式属性
- Lit响应式属性怎样设置attribute与property的映射
- 429浏览 收藏
-
- 前端进阶之JavaScript设计模式
- 设计模式是开发人员在软件开发过程中面临一般问题时的解决方案,代表了最佳的实践。本课程的主打内容包括JS常见设计模式以及具体应用场景,打造一站式知识长龙服务,适合有JS基础的同学学习。
- 543次学习
-
- GO语言核心编程课程
- 本课程采用真实案例,全面具体可落地,从理论到实践,一步一步将GO核心编程技术、编程思想、底层实现融会贯通,使学习者贴近时代脉搏,做IT互联网时代的弄潮儿。
- 516次学习
-
- 简单聊聊mysql8与网络通信
- 如有问题加微信:Le-studyg;在课程中,我们将首先介绍MySQL8的新特性,包括性能优化、安全增强、新数据类型等,帮助学生快速熟悉MySQL8的最新功能。接着,我们将深入解析MySQL的网络通信机制,包括协议、连接管理、数据传输等,让
- 500次学习
-
- JavaScript正则表达式基础与实战
- 在任何一门编程语言中,正则表达式,都是一项重要的知识,它提供了高效的字符串匹配与捕获机制,可以极大的简化程序设计。
- 487次学习
-
- 从零制作响应式网站—Grid布局
- 本系列教程将展示从零制作一个假想的网络科技公司官网,分为导航,轮播,关于我们,成功案例,服务流程,团队介绍,数据部分,公司动态,底部信息等内容区块。网站整体采用CSSGrid布局,支持响应式,有流畅过渡和展现动画。
- 485次学习
-
- PubMedQA
- 深入了解PubMedQA生物医学问答数据集,涵盖其核心功能、使用方法及在临床决策、药物研发等场景的应用,助力提升NLP模型性能。
- 463次使用
-
- H2O EvalGPT
- H2O EvalGPT是H2O.ai推出的开源LLM评估平台,提供详细的大模型性能排行榜、行业特定基准测试及A/B测试功能,助您快速选择最适合项目的高性能大语言模型。
- 527次使用
-
- LMArena
- LMArena是加州大学伯克利分校推出的AI模型匿名评测平台。通过盲测投票机制,用户可对比不同大模型回答并生成实时排行榜,助力开发者优化模型及用户选择最佳AI工具。
- 545次使用
-
- HELM
- 深入了解斯坦福推出的HELM(Holistic Evaluation of Language Models)大模型评测体系。本文解析其核心功能、安装配置步骤及应用场景,涵盖准确性、公平性、鲁棒性等多维度指标,助力开发者全面优化语言模型性能。
- 494次使用
-
- MMBench
- MMBench是由上海人工智能实验室等机构联合推出的多模态基准测试平台,提供细粒度能力评估、大规模数据集及VLMEvalKit工具。本文详细介绍其核心功能、安装使用方法及应用场景,助力开发者全面评估多模态模型性能。
- 313次使用
-
- JavaScript函数定义及示例详解
- 2025-05-11 502浏览
-
- 智能体安全引领产业升级——国内AI安全产品市场深度分析
- 2026-08-21 501浏览
-
- CSS变量简化按钮悬停效果技巧
- 2026-05-31 501浏览
-
- JavaScript符号类型详解与应用
- 2026-05-31 501浏览
-
- HTML剪贴板复制粘贴怎么用
- 2026-05-26 501浏览

