奇怪的问题

我某个属性是这样写的:

        _listeners: {
            default: [],
            tooltip: '监听器'
        },

很明显,它的默认值应该是个空数组,但我在场景文件里发现

    "_listeners": [
      {
        "__id__": 163
      },
      {
        "__id__": 163
      },
      {
        "__id__": 163
      }
    ],

不知道从哪冒出来的数组元素,而且这个属性我加了_下划线,是不会出现在编辑器里的,那这个值又是怎么来的?

有可能是你通过脚本里赋值的

刚才发现是这样的

    editor: {
        menu: 'module/PlayerListener',
        executeInEditMode: true
    },

    properties: {
        player: {
            default: null,
            type: require('Player'),
            tooltip: '要监听的对象',
            notify: function(old) {
                if(this.player !== old && this.enabled) {
                    if(cc.isValid(old))
                        old.removeListener(this);
                    if(cc.isValid(this.player))
                        this.player.addListener(this);
                }
            }
        }
    },

如果某个属性加了notify回调,并且设置了executeInEditMode的话,在编辑器里修改这个属性会导致结果直接写进场景文件里,我也不知道这样到底好不好,但麻烦的是,写进去之后就不知道该怎么消除了,直接修改场景文件?

这个是用户行为,用户自己要负责提供可还原的操作入口。

好吧,这么说,如果你是用户,你怎么还原?有途径没?

刚才进一步发现这个与executeInEditMode无关,在编辑模式下怎么都会触发

针对现有的问题,用户可以在 player 的 notify 中判断 this.player 是否存在,如果为 null 则 remove old。
也可以定义其它的 getset,在 setter 中清空 listener,也可以在 _listeners 所在的组件上点击组件菜单中的 Reset。

不过我个人则是建议去掉 _listeners 数组,采用 hierarchy 来维护引用关系,这样便于控制。 例如你可以在 onLoad 时,遍历某节点下的所有 children,将 children 都 add 到 _listeners,_listeners 不可序列化。

还真不能用hierarchy来维护,listener的分布是零散的,东一个,西一个的,并不能简单的聚合到一起

看你权衡了,反正我是不建议在场景中静态维护节点之间一对多的关系。