cc.Node无论是被添加、被移除,都会调用它的 setParent,咱们来看看源码:

  • 被添加:
    image.png
  • 被移除:
    被移除

被移除代码中的 child.parent 所调用的,其实就是 child.setParent ,它是在 _BaseNode (cc.Node的基类)的原型中定义的,咱们来看看:
image.png

这意味着,我们单单重写 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) },
});

大功告成!


Evans_波
0 声望2 粉丝