2 回答
TA贡献1815条经验 获得超13个赞
如果您不想复制对象,并且希望确保原始对象不能在外部发生变异,则一种选择是返回一个代理,该代理在任何尝试发生变异时抛出:
const handler = {
get(obj, prop) {
return obj[prop];
},
set() {
throw new Error('Setting not permitted');
}
}
class MyClass {
_myIds = ['foo', 'bar']
getIds() {
return new Proxy(this._myIds, handler);
}
}
const instance = new MyClass();
const ids = instance.getIds();
console.log(ids);
// Error:
// ids[2] = 'baz';
// Error:
// ids.push('baz');
当然,instance._myIds在技术上仍然是可见的——如果你想防止这种情况发生,你可以使用类似WeakMap 的东西来确保私有数组真正只在类内部可见。
但是代理有点慢。您可能会考虑使用类似于 Typescript 的东西ReadonlyArray- 这样,您可以确保代码不包含任何会在返回数组后改变数组的内容,同时在运行时保持实际代码快速:
private myIds = ['foo', 'bar']
public getIds() {
return this.myIds as ReadonlyArray<string>;
}
添加回答
举报