格式化后
上面的截图是.ts文件编译后的.js代码。
下面是.ts代码
下面是.js代码
这样导致xxx属性的getter和setter方法没有设置成功。我这里有一点奇怪的是既定义xxx变量后又把xxx变成了getter和setter,不知道这样被不被允许。
格式化后
上面的截图是.ts文件编译后的.js代码。
下面是.ts代码
下面是.js代码
这样导致xxx属性的getter和setter方法没有设置成功。我这里有一点奇怪的是既定义xxx变量后又把xxx变成了getter和setter,不知道这样被不被允许。
你的xxx这样设置了 没有意义 你想下 xxx本身就是public的 就算没有set get 外面也能访问
没想过外面不可以访问,我是想重新赋值的时候有一个事件派发出去。
问题的本身是Creator编译后这种装饰器失效了。
/**
* 装饰器.给对象的私有属性添加set get方法,为了不报错
* 可能需要对装饰的类添加decare 属性声明
* 默认下划线的属性是private的
* @param delegate "set" | "get" | "both" set:只允许设置值,get:只允许获取值,both:允许设置值和获取值
* @returns
*/
export function delegateSetget(delegate?: "set" | "get" | "both") {
return function (target: any, key: string) {
const hasProperty = key.startsWith("_")//默认带下划线的属性为私有属性
if (!hasProperty) return
var k = key.replace("_", "")
Reflect.defineProperty(target, k, {
configurable: false,
enumerable: false,
get: function () {
if (delegate == "set") {
return console.error("当前%s属性不能设置get值!", "%s".format(k))
}
return this[key]
},
set: function (value) {
if (delegate == "get") {
return console.error("当前%s属性不能设置set值!", "%s".format(k))
}
this[key] = value
},
})
}
}
class Test {
declare name: string//名字属性
@delegateSetget()
private _name: string
}
这是我能想到的了,也是目前跑得没问题的
谢谢你给我提供了另一个思路,也希望官方能解决上面说到的问题。
官方不会管这个,属于是自定义的部分
语言层面的东西官方不会管的 不过感觉上面那个ts代码的装饰器写的怪怪的 好像啥也没做
看你需求应该是直接写一个装饰器函数(不需要自定义传参的话不用写装饰器工厂返回装饰器函数) 然后装饰器函数返回一个属性描述符 然后只要在属性描述符的get set里写逻辑就好 比如在set里输出一下newValue或者发送啥事件随你
其实比较烦的是没有代码提示,哈哈
所以才会有decare
这种可以应付着一些特殊情况 比如突然那个name的set,get里面要做一些特殊操作
然后就可以删除装饰器 重写set get
剩下的一般就是封装习惯而已
前辈,这个代码在3.8.3不生效啊,
请问您在哪个版本是可行的?
可以的 2.4.13 3.8.3都是可以的 写法跟cocos关系不大 跟ts版本解析有关
有解决了,是编译器行为导致的问题,谢谢