修饰器定义getter和setter不起作用

image

格式化后

image

上面的截图是.ts文件编译后的.js代码。

下面是.ts代码

image

image

下面是.js代码

image

这样导致xxx属性的getter和setter方法没有设置成功。我这里有一点奇怪的是既定义xxx变量后又把xxx变成了getter和setter,不知道这样被不被允许。 :laughing:

@minggo @song2008_2001 @Knox

你的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 :joy:
这种可以应付着一些特殊情况 比如突然那个name的set,get里面要做一些特殊操作
然后就可以删除装饰器 重写set get
剩下的一般就是封装习惯而已

前辈,这个代码在3.8.3不生效啊,

请问您在哪个版本是可行的?

可以的 2.4.13 3.8.3都是可以的 写法跟cocos关系不大 跟ts版本解析有关

有解决了,是编译器行为导致的问题,谢谢