2025-12-23 16:42:04 +08:00

66 lines
2.6 KiB
JavaScript

(function () {
try {
console.log("[Fix] Starting Symbol.metadata replacement (WeChat Safe Mode)...");
// 1. 安全获取全局对象 (兼容微信小游戏/Web/Node)
var root = (typeof globalThis !== 'undefined') ? globalThis :
(typeof GameGlobal !== 'undefined') ? GameGlobal :
(typeof window !== 'undefined') ? window :
(typeof self !== 'undefined') ? self : this;
// 2. 获取原生 Symbol
var NativeSymbol = root.Symbol;
if (!NativeSymbol) {
console.warn("[Fix] Symbol not found, skipping.");
return;
}
// 3. 生成一个全新的 Symbol 作为 metadata 的替代品
// 这个 Symbol 不在 Function.prototype 上,所以不会触发只读错误
var CustomMetadataSymbol = NativeSymbol("Symbol.metadata.custom");
// 4. 创建 Symbol 的代理构造函数
var SymbolProxy = function (description) {
return NativeSymbol(description);
};
// 5. 复制原生 Symbol 的所有静态属性 (iterator, species, for, keyFor 等)
// 使用 Reflect.ownKeys 以确保复制完整
if (typeof Reflect !== 'undefined' && Reflect.ownKeys) {
Reflect.ownKeys(NativeSymbol).forEach(function (key) {
// 跳过这些属性,避免报错
if (key === 'metadata' || key === 'length' || key === 'name' || key === 'arguments' || key === 'caller' || key === 'prototype') return;
try {
var desc = Object.getOwnPropertyDescriptor(NativeSymbol, key);
if (desc) Object.defineProperty(SymbolProxy, key, desc);
} catch (e) {}
});
} else {
// 降级方案 (如果在极老的环境)
for (var key in NativeSymbol) {
if (key !== 'metadata') SymbolProxy[key] = NativeSymbol[key];
}
}
// 6. 恢复原型链指向
SymbolProxy.prototype = NativeSymbol.prototype;
// 7. 【关键】将 metadata 指向我们自定义的 Symbol
// 这样外界调用 Symbol.metadata 时,拿到的实际上是 CustomMetadataSymbol
Object.defineProperty(SymbolProxy, "metadata", {
value: CustomMetadataSymbol,
configurable: false,
writable: false,
enumerable: false
});
// 8. 覆盖全局 Symbol
root.Symbol = SymbolProxy;
console.log("[Fix] Symbol.metadata successfully patched globally.");
} catch (e) {
console.error("[Fix] Patch failed:", e);
}
})();