gpt4 book ai didi

javascript - JS相当于Java的Collections.unmodifiableCollection

转载 作者:行者123 更新时间:2023-12-03 07:20:49 25 4
gpt4 key购买 nike

我经常对我的 java 代码使用这种策略,以便让一个集合只对外界可读,但要避免大量/经常克隆:

public abstract class MyClass {
List<Long> myIds;

public Collection<Long> getIds() {
return Collections.unmodifiableCollection(this.myIds);
}
}

我想在我的 JS 类中遵循相同的模式。这将使我的业务逻辑代码更加安全和清晰,因为我将能够在拥有字段的类中控制对我的列表(推送/拼接等)的所有更改。

目前使用列表的“私有(private)”字段和从外部访问它们的 get-set 函数。唯一缺少的链接是一些等效于 java 的 Collections.unmodifiableCollection 的链接。不会复制整个列表的东西(例如 slice()),并且不会影响原始字段(例如 Object.freeze())。

JS有这样的功能吗?如果没有,有人怎么能达到类似的效果(自定义可迭代对象?)

最佳答案

如果您不想复制对象,并且想确保原始对象不能在外部发生变异,一种选择是返回一个 Proxy,它会在任何尝试发生变异时抛出:

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 的东西以确保私有(private)数组真正只在类内部可见。

但是代理有点慢。您可能会考虑像 Typescript 的 ReadonlyArray 这样的东西 - 这样,您可以确保代码不包含任何在 返回 后改变数组的内容,同时保持实际代码的速度在运行时:

private myIds = ['foo', 'bar']
public getIds() {
return this.myIds as ReadonlyArray<string>;
}

关于javascript - JS相当于Java的Collections.unmodifiableCollection,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56322702/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com