实例化用于库模拟的父函数后无法访问内部fetch函数的问题
这种属性明明可见却调用不了的情况,在做库模拟时真的挺让人头疼的,我来帮你梳理下几个常见原因和对应的解决思路:
1. 先排查fetch的上下文绑定问题
大概率是函数丢失了正确的this指向!很多时候父函数内部的fetch方法依赖实例自身的上下文,但当你直接调用instance.fetch()时,this可能跑偏到全局对象(非严格模式)或者直接变成undefined(严格模式),导致方法执行异常。
解决办法很直接:
- 在父函数的构造函数里手动绑定上下文:
function ParentFunction() { // 初始化你的属性配置 this.counter = 0; // 绑定fetch的this到当前实例 this.fetch = this.fetch.bind(this); } ParentFunction.prototype.fetch = function() { // 这里的this就能正确指向实例了 this.counter++; console.log('执行fetch逻辑'); };
- 如果是用class语法写的父类,直接用箭头函数定义
fetch,它会自动捕获当前实例的上下文:
class ParentClass { constructor() { this.counter = 0; } // 箭头函数自动绑定this fetch = () => { this.counter++; console.log('执行fetch逻辑'); }; }
2. 确认fetch真的是可调用的函数
有时候你打印实例看到的fetch可能只是个对象、或者是getter返回的非函数值,并非真正可调用的函数。先跑一行代码确认下:
console.log(typeof instance.fetch);
如果输出不是"function",那得回头检查父函数里的fetch定义——是不是不小心把它赋值成了对象、字符串这类非函数值?比如这种错误写法:
// 错误示例:把fetch赋值成了配置对象 this.fetch = { url: '/api', method: 'GET' };
3. 检查实例化后是否不小心覆盖了fetch
会不会在你设置递增属性、配置其他属性的过程中,误把fetch给覆盖了?比如:
const instance = new ParentFunction(); // 这里的赋值直接覆盖了原本的fetch方法 instance.fetch = { someConfig: true };
可以在调用前对比下实例化刚完成时的instance.fetch和调用前的状态,看看是不是被修改了。
4. 排查父函数是否用闭包隐藏了真正的fetch
有些库会用闭包封装内部逻辑,你看到的fetch可能只是一个暴露的引用,或者是个代理,实际调用需要特定条件。比如父函数是这样写的:
function ParentFunction() { // 闭包里的内部变量 const internalState = { ready: false }; // 真正的fetch逻辑依赖闭包变量 const internalFetch = () => { if (!internalState.ready) throw new Error('未就绪'); console.log('执行内部fetch'); }; // 暴露fetch,但内部状态可能没初始化 this.fetch = internalFetch; }
这种情况下,你得先确保闭包里的依赖状态(比如上面的internalState.ready)已经被正确初始化,才能正常调用fetch。
内容的提问来源于stack exchange,提问作者Mr Sorbose
相关产品推荐
相关产品推荐

