定义set/get函数报错!

test: { default: 0, type: cc.Integer, get(){ return this._test; }, set(v){ this._test = v; } },
按照例子这样定义set/get函数,编辑器报错:


之前的版本是可以这么写的,最近的版本这样不行了,更新说明也从来没有提及过这个问题。现在要定义set/get必须先手动定义一个同名的下划线属性。

没有人。。。

类似的问题,之前也有人提过,可以多去搜索一下…
简单地说当你为test设定set/get函数时,对test变量的操作实际是在调用set/get两个函数,
它本身就不再保存值了,你获取test的值实际是它get函数中返还的值。
在你写的get函数中返还的是this._test,那么就应该对 _test变量赋值为0。
_test也可以不用定义,js对象中未定义的属性返还值为undefined,它的命名也不非要是下划线加同名。
你甚至可以将get(){return this.a + this.b;//实现成这样的形式}.
多说了几句,其实关键点只在于把实现了set/get存取器的变量视为函数,后面自然好理解了。

你说的我明白,问题是在creatro早期版本里好像是可以的。现在这样的话如果想定义set/get函数那就必须再额外声明一个属性并赋值初始值,更麻烦里啊。之前的做法set/get函数就和default/type一样可以看作是一个属性的属性说明。
`
cardPoint: {
min: 1,
max: 13,
type: cc.Integer,
set(v){
this._cardPoint = v;
this.setCardPoint(v);
},
get(){
return this._cardPoint;
}
},

由于不能在cardPoint里面定义default值,所以也不能在编辑器里面填值,必须在额外定义一个_cardPoint, _cardPoint: { default: 1, },
`
不知道为什么不能直接在cardPoint里面写default了呢?之前版本是可以的。

是我没能理解完全你的意思吗,还是我对这个问题的理解有错。
楼上贴出的文档解释仅是说因为那样无法被序列号,但是无法被序列化的原因又是什么?
因为你不是说之前的版本可以,那么问题不应该还是存在的吗。
之前的版本可以序列号为什么现在不能序列化了?
我上面的回答想说的是,因为设定了set/get的函数和拥有default参数是冲突的。
例如你开始提问中定义的,如果我第一次获取test的值:
var a = test;//这里的test返还该是default的值,还是get函数中的值呢?
无法序列化是因为定义了set/get的test是一种特殊函数的形式存在吧?
所以我想大概之前的版本也是不行的,假设我的理解没有错误的话。
如果你能确信之前的版本也是可以的,我也比较好奇,之前为什么可以那样做。

其实我觉得之前的版本也是不行的,但我没试过不知道,反正现在的官方文档写的get和defalut不能一起写,你应该关注的是设定了get以后,不能指定默认值(就是不能设置default),而不是什么能不能被序列化