要升级的工程中使用的大量 node.tag 与 node.getChildByTag () 但是这些2.0之后方法被删除了,最保险的方法就是自己恢复Node 上的tag 与getChildByTag(); API 但是这需要自己去写
但是自己给Node添加属性的时候,发现了如题的错误。是的 这个就一个为 你没有办法去修改这个属性。
如果你并不太懂去看下查查 Object setter与 getter ,从而会引引申出很多知识点
which has only a getter的报错
我想你应该知道是什么意思,他的意思是tag只可读取不可设置。
后来我发现原因是 因为cocosCreate2.12把 Node (Object)给冻结了
使用的是下面的方法
node 是某个节点 因为节点本身就是Object类型
console.log(‘判断对象是否可扩展:’,Object.isExtensible(node)) 打印出来是 false
console.log(‘判断对象是否已经冻结。:’,Object.isFrozen(node)) 打印出来是 true
console.log(‘判断对象是否已经密封。:’,Object.isSealed(node)) 打印出来是 false
但是如何添加属性呢,其实很简单。
我这边的游戏要从19…3升级到2.1.2
let cell ={}
cell.tag = index; --我需要在预制体上添加一个tag 结果出现了标题的错误
处理办法很简单 只用强大的
Object.defineProperty(); 就可以实现我们想要的 给冻结的node上添加相关的属性
如下
let cell ={}
Object.defineProperty(cell,“tag”,{
get: function () {
return this._tag;
},
set : function (val) {
this._tag = val;
},
configurable : true
});
然后你就可以使用 ,
cell.tag = index
那方法如何添加呢? 骑着驴找驴
我去找如何给node添加方法 function() ,找不到,突然发现。添加属性本身是什么就是不限制的。所以我们我添加一个属性叫 getChildByTag 然后再取出来这个属性。
把他赋值成为方法 this.content.getChildByTag = function(_tag){},这样就实现了
具体如下
然后可以使用了,但是怎么添加方法呢,一样
Object.defineProperty(this.content,"getChildByTag",{
get: function () {
return this._getChildByTag;
},
set : function (val) {
this._getChildByTag = val;
},
configurable : true
});
this.content.getChildByTag = function(_tag){
// console.log('getChildByTag测试使用的传进来的参数',_tag)
// if (!_tag) {
// cc.log("Invalid uuid");
// return null;
// }
var locChildren = this._children;
for (var i = 0, len = locChildren.length; i < len; i++) {
if (locChildren[i]._tag === _tag)
return locChildren[i];
}
return null;
};
然后你就可以使用 this.content.getChildByTag() 这个方法了