有没有什么办法能把cocos类变成键值对

有问题 属性装饰器会比类装饰器先初始化,此处的defineProperty会不触发

你需要在属性装饰器中, 把当前的属性存到你constructor.map 中,在类装饰器中defineProperty constructor.map 信息才行

听不懂诶 :sob:

你可以请教一下这些大牛。你为啥要用全static 来实现这些属性。 :yum:

因为使用起来比较方便快捷 :sob:

static 可以直接读取类名,然后取到变量的值, 如果做成属性,需要实例化类, 才能读取到值, 常见的方法是做成单利.

你研究下单利怎么做吧, 你将会学到新的东西

嗯呢,牛。 大牛

// 方法1: 使用 Object.getOwnPropertyNames() 和 Object.getOwnPropertyDescriptor()

function getStaticProperties(className: any): Record<string, any> {

  const staticProps: Record<string, any> = {};

 

  // 获取类的所有自有属性(包括不可枚举的)

  const propertyNames = Object.getOwnPropertyNames(className);

 

  for (const propName of propertyNames) {

    // 排除构造函数本身和原型

    if (propName === 'prototype' || propName === 'length' || propName === 'name') {

      continue;

    }

   

    const descriptor = Object.getOwnPropertyDescriptor(className, propName);

   

    // 只获取静态属性(不是方法,或者如果是方法也可以包含)

    if (descriptor && 'value' in descriptor) {

      staticProps[propName] = descriptor.value;

    }

  }
  return staticProps;
}


let a = getStaticProperties(oops)
       console.log(a)
       //遍历a的属性
       Object.keys(a).forEach((key)=>{
        console.log("key",key,a[key])
       })

问ai的结果

这个问题我已经解决了screenshot_2025-12-12_14-03-44

现在用起来看起来没什么问题,一次性保存和读取,各位大佬看看这样写会不会有什么其他的问题风险存在

更新数据时我就判断会话中是否存在这个属性,然后调用这个类的update方法

啊这……这个嵌套,还不是单例。果然是大家想多了。那你为什么不直接把初始数据写成json,这个类只做读取,记录和初始化的单例呢。你这样第二次调用的时候还有update函数吗,我对语理解不深知之甚少,有这个疑惑哈 :cold_sweat: :cold_sweat: :cold_sweat:

二次调用是指?我这样写是为了可以在其他脚本方便调用,之前是只把他当作配置类来使用,但到保存数据的时候就傻眼了,变量太多,一个一个保存到会话太麻烦,读取的时候也是需要一个一个读,我就想着有没有办法可以一次性保存多条数据,我就想到了可以把这些数据合并成一个对象,但是这样写的话我之前在其他脚本中的类名点属性就都全部更改,也很麻烦,于是我就改成这个样子了,但是由于其他脚本都只是引入这个类无法对这个类进行更改,我就添加了一个update方法,让其他脚本调用来让他自己更改自己,这样就实现了一次性保存和读取,我的读取操作只在游戏开始执行一次,这个二次调用应该是没什么问题的,我是怕我这样写会产生什么莫名其妙的bug,就想着问一问

不过你倒是提醒我了,我本来放在把读取放在了游戏主页,但是游戏主页可能会来回跳转多次调用,我现在改到了游戏加载页,真正的只读取一次

嗯,你应该是把整个Gameconfig对象存起来了,这样那些函数不也得存吗。你数据单独搞个类,在gameconfig里面用get和set函数处理这些数据,外部调用是没差的
class Gameconfig{
_data = { data1:1 }
get data1(){return this._data.data1}
set data1(data){this._data.data1 = data1}
}

存的时候直接存_data数据吧

改成这样

const json = JSON.parse("xxx")
for (let key in json) {
    this[key] = json[key]
}

.....
export const gameconfig=new Gameconfig()

....

不然触发update后你就不是一个class了,而是一普通对象;
如果存储频繁和新增字段的话,可能遇到瓶颈

好的谢谢,改完了

这个调用的时候需不需要 gameconfig._data.XXX

不用,跟原本一样调用,但你得把get和set函数都写好

我的那种是不是方便点