我想在javascript中创建一个封闭的对象,只能使用Object.defineProperty进行编辑,而不是以正常的方式对其进行编辑...
目标是,我正在创建一个lib,用户可以在其中读取一个名为dictionary的对象,但是他们也可以编辑它!是否有任何方法可以让用户读取并由我编辑的对象?
答案 0 :(得分:0)
无法保护任何物体部件。
答案 1 :(得分:0)
您可以使用Object.defineProperty提供一些基本保护:
var o = { a: 5 };
o._protected = {};
o._protected.a = o.a;
Object.defineProperty(o, 'a', {
get: function() { return this._protected.a; },
set: function(value) {
if (value > 0 && value < 5) {
this._protected.a = value;
}
configurable: false
});
这将限制此对象中属性a
的更改,以便它们将通过get(读取)/ set(更新)。当然,在这种情况下,_protected
对象可以被操纵,但它确实需要用户有意识地“破解”它。尝试直接更改财产a
将由您控制。
在这个例子中,尝试设置o.a = 6将导致o.a没有变化(当然,如果可以的话,你可以将它设置为你的set函数中允许的最大值)。
您可以通过不提供设置功能来阻止对o.a的更改。
这对于确保属性仅获得“有效”值非常方便,而且我经常以这种方式使用它。
答案 2 :(得分:0)
我找到了!请告诉我这个解决方案有什么问题:
String replaceHalf(String input, String search) {
String reversed = new StringBuilder(search).reverse().toString();
StringBuilder sb = new StringBuilder(input);
int pos = -search.length();
while (true) {
// Find the next occurrence...
pos = input.indexOf(search, pos + search.length());
if (pos == -1) break;
// ...but ignore it, and find the next occurrence.
pos = input.indexOf(search, pos + search.length());
if (pos == -1) break;
sb.replace(pos, pos + search.length(), reversed);
}
return sb.toString();
}