DevTools可调用g.worldConfig.getWorldName(),Tampermonkey调用报错求助
解决Tampermonkey脚本调用
g.worldConfig.getWorldName()报错的问题 问题核心
DevTools中调用正常但Tampermonkey脚本报错TypeError: Cannot read properties of null (reading 'worldname'),本质是两个环境的执行时机差异+私有字段的上下文绑定问题:
- Tampermonkey脚本可能在页面完成
g.worldConfig私有字段_config初始化前就执行了 - 直接调用原型方法时
this上下文绑定错误,导致_classPrivateFieldGet无法读取正确的私有值
可行解决方案
1. 调整脚本执行时机
确保脚本在页面完全加载、g.worldConfig初始化完成后运行:
在Tampermonkey脚本头部添加:
// @run-at document-idle
如果还是存在时机问题,用定时器监听状态直到可用:
function getWorldNameSafely() { if (g?.worldConfig) { try { const name = g.worldConfig.getWorldName(); if (name) return name; } catch (e) {} } setTimeout(getWorldNameSafely, 100); } getWorldNameSafely();
2. 修复this绑定
直接调用原型方法时,必须绑定g.worldConfig作为上下文:
const getWorldNameFn = g.worldConfig.__proto__.getWorldName; const worldName = getWorldNameFn.call(g.worldConfig);
3. 绕过私有字段直接取值
既然getWorldName本质是读取私有字段里的worldname,可以直接定位该值:
先在DevTools执行Object.getOwnPropertySymbols(g.worldConfig),找到对应_config的符号(比如Symbol(#config)),再在脚本中:
const configSymbol = Object.getOwnPropertySymbols(g.worldConfig).find(sym => sym.description === '#config'); const worldName = g.worldConfig[configSymbol]?.worldname;
内容的提问来源于stack exchange,提问作者johnas
相关产品推荐
相关产品推荐

