javascript - 在正在定义的变量内使用扩展运算符
问题描述
我有一个包含子对象的对象。其中一些子对象希望从其他子对象继承,如下所示:
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 */ },
// ...
}
}
我想同时拥有registeredSocket
并unregisteredSocket
继承默认值setActionSet
,并setActionSet
在registeredSocket
. 但是,当我运行该程序时,它并没有像我想象unregisteredSocket
的那样继承自- 没有一个's 成员被解包到's. 有,但它是被重新定义的。global
global
unregisteredSocket
registeredSocket
setActionSet
socket.actions.setActoinSet
这会导致调用register
ofunregisteredSocket
失败,正如setActionSet
尚未定义的那样。
解决方案
在您的代码中,this
不是指actions
对象,而是指window
. 这就是扩展运算符什么都不做的原因,因为this.global
is 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
// ...
}
}
请注意,当您多次定义对象的相同属性时,顺序很重要(只有最后一个重要)。
推荐阅读
- javascript - 如何在按钮单击时显示引导折叠 div?
- javascript - JavaScript 中的因式分解仅适用于递减递归,为什么?
- ios - 如何确定横向是否是常规的horizontalSizeClass?
- angular7 - 如何将响应映射到Angular 7中的对象
- r - R 的 HDBSCAN 因大型数据集而崩溃
- octave - 如何从八度音阶中选择图像的某些部分
- sql - SQL | 如何迭代插入或更新语句以提高性能并确保其安全
- android - 自定义 Android Lint 访问方法参考
- c - 使用偏移量在微控制器中获取寄存器完整地址的目的是什么?
- debugging - 如何在 IntelliJ 中调试在 Kubernetes pod 中运行的 Kotlin 应用程序?