Javascript 如何更新对象属性的可枚举性?
我将对象定义如下:Javascript 如何更新对象属性的可枚举性?,javascript,object,properties,hashtable,enumerable,Javascript,Object,Properties,Hashtable,Enumerable,我将对象定义如下: var obj={}; var name=“不可计算”; var value=“你好世界”; defineProperty(obj,name,{value:value, 可写:对, 可枚举:false, 可配置:true }); 控制台日志(obj); //代码段控制台中的输出:{} //浏览器控制台中的输出:{nonenumerable:“hello world”}对象。defineProperty()也可用于修改现有属性的描述符。对于您的用例,更好的方法是序列化原始对象
var obj={};
var name=“不可计算”;
var value=“你好世界”;
defineProperty(obj,name,{value:value,
可写:对,
可枚举:false,
可配置:true
});
控制台日志(obj);
//代码段控制台中的输出:{}
//浏览器控制台中的输出:{nonenumerable:“hello world”}
对象。defineProperty()
也可用于修改现有属性的描述符。对于您的用例,更好的方法是序列化原始对象的副本:
var open = {};
Object.assign(open, obj);
open.all = obj.all;
localStorage.setItem("localObj", JSON.stringify(open));
正如ccprog的答案中提到的,我可以使用to
Object.defineProperty()
来修改我的对象属性
var obj={};
var name=“不可计算”;
var value=“你好世界”;
defineProperty(obj,name,{value:value,
可写:对,
可枚举:false,
可配置:true
});
控制台日志(obj);
//代码段控制台中的输出:{}
//浏览器控制台中的输出:{不可计数:“hello world”}
Object.defineProperty(对象,名称{
可枚举:true
});
控制台日志(obj)代码>辅助函数
function load(inp) {
var spec = function (o) {
Object.defineProperty(o, 'all', {
writable: true,
enumerable: false,
configurable : true,
value: o.all || {}
});
Object.defineProperty(o, "toString", {
value: function () {
Object.defineProperty(this, 'all', { enumerable: true});
var ret = JSON.stringify(this);
Object.defineProperty(this, 'all', { enumerable: false});
return ret;
}
});
return o;
};
return spec(typeof inp == "string" ? JSON.parse(inp) : inp);
}
您可以像这样初始化对象
var obj = load({
1: { id: 1, start: 3, end: 6 },
2: { id: 2, start: 5, end: 8 },
3: { id: 3, start: 2, end: 4 }
});
obj.all.start = 0;
obj.all.end = 10;
var obj1 = load({
1: { id: 1, start: 3, end: 6 },
2: { id: 2, start: 5, end: 8 },
3: { id: 3, start: 2, end: 4 },
all: {
start: 0,
end: 10
}
});
甚至像这样
var obj = load({
1: { id: 1, start: 3, end: 6 },
2: { id: 2, start: 5, end: 8 },
3: { id: 3, start: 2, end: 4 }
});
obj.all.start = 0;
obj.all.end = 10;
var obj1 = load({
1: { id: 1, start: 3, end: 6 },
2: { id: 2, start: 5, end: 8 },
3: { id: 3, start: 2, end: 4 },
all: {
start: 0,
end: 10
}
});
储存
localStorage.setItem('testing', obj)
从存储器中加载它
var obj2 = load(localStorage.getItem('testing'));
console.log(obj.toString() == obj2.toString());
// true
for…in
仅“循环”通过可枚举项-不是吗?是的。这就是为什么我将属性“all”定义为“nonnumerable”。那么,问题是什么?为什么它需要“变得”可枚举<代码>对象。所有
都有值helloworld代码>-如果您使用可枚举:true
创建它,则前一个循环将不会被称为Retrospectiveli更新代码段。我需要一个函数来一次性更改所有值,并自行更改每个值。这就是为什么要用enumerable:false定义obj.all
,然后我需要将其存储在本地存储器中,以便在第二个页面上使用数据。当我回到选择页面时,我还需要知道“all”的值。感谢提示,我可以修改现有属性的描述符。不幸的是,我不能使用对象的副本,因为在加载对象时,我需要将对象与克隆合并。这是一个非常好的解决方案,辅助函数也非常好。我已经解决了这个问题,但这和我的解决方案非常相似。