Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/471.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 如何更新对象属性的可枚举性?_Javascript_Object_Properties_Hashtable_Enumerable - Fatal编程技术网

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”的值。感谢提示,我可以修改现有属性的描述符。不幸的是,我不能使用对象的副本,因为在加载对象时,我需要将对象与克隆合并。这是一个非常好的解决方案,辅助函数也非常好。我已经解决了这个问题,但这和我的解决方案非常相似。