66 lines
2.6 KiB
JavaScript
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);
|
|
}
|
|
})(); |