首页 > 解决方案 > 我可以在 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对象在模块之外成为私有/不可访问的吗?

标签: javascriptoop

解决方案


推荐阅读