javascript - 我可以在 JavaScript 中按值而不是引用返回对象吗?
问题描述
我已经建立了一个程序来跟踪学校的成绩,以及哪些学生属于每个年级。类的方法之一是在roster()
按字母顺序对学生进行排序后返回学校名册。在测试中,我试图查看是否可以在课堂之外修改学校花名册,特别是通过调用roster()
、存储该对象并对其进行修改。这是可能的,因为 JavaScript 正在返回对我的this._roster
对象的引用。为了通过测试,我必须无法修改返回的对象。
信用:我正在做一个来自 exercism.io 的项目
这是我的代码:
export class GradeSchool {
constructor() {
this._roster = {};
}
roster() {
const keys = Object.keys(this._roster);
for (let i = 0; i < keys.length; i++) {
this._roster[keys[i]].sort();
}
return this._roster;
}
add(name, grade) {
if(this._roster.hasOwnProperty(grade)) {
this._roster[grade].push(name);
} else {
this._roster[grade] = [name];
}
}
}
我的测试:
test('roster cannot be modified outside of module', () => {
school.add('Aimee', 2);
const roster = school.roster();
roster[2].push('Oops.');
const expectedDb = { 2: ['Aimee'] };
expect(school.roster()).toEqual(expectedDb);
});
我尝试修改我roster()
的,如下所示: ... 从技术上讲,它不再修改this._roster
对象,但显然仍然不起作用,因为它仍然通过引用传递对象,该对象在模块外部存储和修改。
roster() {
const duplicateRoster = {};
const keys = Object.keys(this._roster);
for (let i = 0; i < keys.length; i++) {
duplicateRoster[keys[i]] = this._roster[keys[i]].sort();
}
return duplicateRoster;
}
我一直在研究如何按值而不是按引用返回对象。然而,我一直未能找到答案。如果有人知道怎么做,请在这里告诉我。如果不可能,有人可以解释我如何使我的this._roster
对象在模块之外成为私有/不可访问的吗?
解决方案
推荐阅读
- c# - 将日期时间存储在天蓝色表存储中
- rust - 如何将 crypto::sha2::Sha256 哈希转换为 &[u8] 表示?
- stargazer - Stargazer 在负数值的减号周围加上额外的 $...$
- css - 使用 Angular-CLI 进行 CSS 优化后处理
- ios - React Native标签栏闪烁
- jquery - 隐藏已附加内容的问题
- python - Matplotlib 自定义样式:不同的刻度颜色和刻度标签颜色
- swift - 将 Firestore 数据显示到 UIPicker Swift 4
- python - 通过python仅从txt文件中提取特定文本
- wordpress - Woocommerce 自定义文本区域的文本域