首页 > 解决方案 > 在正在定义的变量内使用扩展运算符

问题描述

我有一个包含子对象的对象。其中一些子对象希望从其他子对象继承,如下所示:

const actions = {
    global: {
        name: 'Global',
        setActionSet: (socket, newActionSet) => {
            sockets.actions = newActionSet;
        }
    },

    unregisteredSocket: {
        ...this.global,
        name: 'Unregistered',
        register: (socket, newActionSetName) => {
            socket.actions.setActionSet(socket, actionGroups[newActionSetName]);
        }
    },

    registeredSocket: {
        ...this.global,
        name: 'registered',
        setActionSet: (socket, newActionSet) => { /* something different from when it is unregistered */ },
        // ...
    }
}

我想同时拥有registeredSocketunregisteredSocket继承默认值setActionSet,并setActionSetregisteredSocket. 但是,当我运行该程序时,它并没有像我想象unregisteredSocket的那样继承自- 没有一个's 成员被解包到's. 有,但它是被重新定义的。globalglobalunregisteredSocketregisteredSocketsetActionSet

socket.actions.setActoinSet这会导致调用registerofunregisteredSocket失败,正如setActionSet尚未定义的那样。

标签: javascript

解决方案


在您的代码中,this不是指actions对象,而是指window. 这就是扩展运算符什么都不做的原因,因为this.globalis undefined

这可以满足您的要求:

const global = {
    name: 'Global',
    setActionSet: (socket, newActionSet) => {
        sockets.actions = newActionSet;
    }
};

const actions = {
    global,
    unregisteredSocket: {
        name: 'Unregistered',
        register: (socket, newActionSetName) => {
            socket.actions.setActionSet(socket, actionGroups[newActionSetName]);
        },
        ...global
    },

    registeredSocket: {
        name: 'registered',
        setActionSet: (socket, newActionSet) => { /* something different from when it is unregistered */
        },
        ...global
        // ...
    }
}

请注意,当您多次定义对象的相同属性时,顺序很重要(只有最后一个重要)。


推荐阅读