gameClient/assets/pkg/mvc/ObDecorator.ts
2025-07-01 00:00:42 +08:00

33 lines
1.1 KiB
TypeScript

import { EventManager } from './EventManager'
// 装饰器工厂函数
export function Ob(eventName?: string) {
return function (target: any, propertyKey: string) {
// 存储原始值的弱映射
const privateMap = new WeakMap()
// 定义getter/setter
Object.defineProperty(target, propertyKey, {
get: function () {
return privateMap.get(this)?.value
},
set: function (newValue) {
const oldValue = privateMap.get(this)?.value
if (oldValue == newValue) return
privateMap.set(this, { value: newValue })
// 触发事件
const eventMgr = EventManager.Instance()
const finalEventName = eventName || `${target.constructor.name.toLowerCase()}:${propertyKey}`
const data = { property: propertyKey, oldValue, newValue }
eventMgr.Emit(finalEventName, data)
// 触发通用事件
const commEventName = `${target.constructor.name.toLowerCase()}:property`
const commData = { property: propertyKey, oldValue, newValue }
eventMgr.Emit(commEventName, commData)
},
enumerable: true,
configurable: true,
})
}
}