cc.Node 无论是被增加、被移除,都会调用它的 setParent
,咱们来看看源码:
- 被增加:
- 被移除:
被移除代码中的 child.parent
所调用的,其实就是 child.setParent
,它是在 _BaseNode
(cc.Node 的基类)的原型中定义的,咱们来看看:
这意味着,咱们单单重写 setParent
办法的话,只能解决被增加的状况,对被移除无能为力。
那咱们只有想方法替换掉这个 parent setter
就能达到目标了。
办法是间接给 cc.Node 的原型定义一个属性:
Object.defineProperty(cc.Node.prototype, "parent", {
// getter 也要定义,不然会报错,还是间接调用 getParent
get: function() { return this.getParent(); },
set: function(v) {/** your code */},
});
但在理论场景中,咱们并不需要给所有的 cc.Node 增加监听,只须要给那些关注被增加 / 移除操作的对象增加即可:
/** 自定义节点 */
class CustomNode extends cc.Node {
// 定义本人的解决办法。当然,持续应用 setParent 作为办法名也能够
mySetParent(v: cc.Node) {
// 肯定要调用父类的 setParent
super.setParent(v);
/** your code */
}
}
// 给自定义节点定义属性
Object.defineProperty(CustomNode.prototype, "parent", {get: function() {return this.getParent(); },
set: function(v) {this.mySetParent(v) },
});
功败垂成!