手写call方法
<script> // <!-- 实现mycall方法, 功能和调用形式与call一致 --> // 原型定义一个mycall方法, 大家都能调用 Function.prototype.mycall = function (thisArg, ...argN) { // console.log('mycall方法被调用了'); // 设置this并调用原函数 // 接收剩余参数 // 将动态添加的属性删掉 // 返回结果 thisArg.f = this const res = thisArg.f(...argN) delete thisArg.f return res } const person = { name: 'mandy', age: 21 } function fun(numA, numB) { console.log(this); console.log(numA, numB); return numA + numB; } const result = fun.mycall(person, 10, 11) console.log('result:' + result); const result2 = fun.call(person, 20, 21) console.log('call - result:' + result2); </script>
.
.
.
调试结果:
.
.
..
在thisArg.f = this
中动态添加了一个f方法并将fun设置给了这个方法
如果有同名属性f怎么办?
使用symbol
进行调优
Symbol 代表创建后独一无二且不可变的数据类型,它主要是为了解决可能出现的全局变量冲突的问题
const internalF = Symbol('internalF') // 使用[]将internalF解析为属性名 thisArg[internalF] = this const res = thisArg[internalF](...argN) delete thisArg[internalF] return res
.
.
.
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· DeepSeek 开源周回顾「GitHub 热点速览」
· 物流快递公司核心技术能力-地址解析分单基础技术分享
· .NET 10首个预览版发布:重大改进与新特性概览!
· AI与.NET技术实操系列(二):开始使用ML.NET
· 单线程的Redis速度为什么快?