首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何更新对象属性的enumerable?

如何更新对象属性的enumerable?
EN

Stack Overflow用户
提问于 2017-02-22 21:56:50
回答 3查看 412关注 0票数 1

我按如下方式定义一个对象:

代码语言:javascript
复制
var obj = {};
var name = "nonenumerable";
var value = "hello world";

Object.defineProperty(obj, name, {value: value,
  writable : true,
  enumerable : false,
  configurable : true
});

console.log(obj); 
//output in code snippet console: {}
//output in browser console: { nonenumerable: "hello world" }

现在,我想使用以下命令将对象存储到本地存储中

代码语言:javascript
复制
localStorage.setItem("localObj", JSON.stringify(obj));

我知道JsonObjects不包含“不可枚举”,因此我的属性不会被存储。我的问题是我使用对象作为一种“哈希表”。

代码语言:javascript
复制
var obj = {
  1: { id: 1, start: 3, end: 6 },
  2: { id: 2, start: 5, end: 8 },
  3: { id: 3, start: 2, end: 4 }
};
Object.defineProperty(obj, "all", {value: {},
  writable : true,
  enumerable : false,
  configurable : true
});
obj.all.start = 0;
obj.all.end = 10;

function setStart(id, add){
  if(add) obj[id].start += 1;
  else obj[id].start -= 1
  updateContent("start", id, obj[id].start);
}

function setAllStart(start, add){
  if(add) obj.all.start += 1;
  else obj.all.start -= 1
  updateContent("start", "all", obj.all.start);
  for(id in obj){
    obj[id].start = obj.all.start;
    updateContent("start", id, obj[id].start);
  }
}

function setEnd(id, add){
  if(add) obj[id].end += 1;
  else obj[id].end -= 1
  updateContent("end", id, obj[id].end);
}

function setAllEnd(start, add){
  if(add) obj.all.end += 1;
  else obj.all.end -= 1
  updateContent("end", "all", obj.all.end);
  for(id in obj){
    obj[id].end = obj.all.end;
    updateContent("end", id, obj[id].end);
  }
}

function updateContent(selector, id, content){
   document.querySelector("#" + selector + "-" + id).innerHTML = content;
}
代码语言:javascript
复制
.value {
  display: inline-block;
}
代码语言:javascript
复制
<div>
  AllStart:
  <button type="button" onclick="setAllStart(3, false);">-</button>
  <div id="start-all" class="value">0</div>
  <button type="button" onclick="setAllStart(3, true);">+</button>
</div>
<div>
  AllEnd:
  <button type="button" onclick="setAllEnd(3, false);">-</button>
  <div id="end-all" class="value">10</div>
  <button type="button" onclick="setAllEnd(3, true);">+</button>
</div>
<div>
  Start 1:
  <button type="button" onclick="setStart(1, false);">-</button>
  <div id="start-1" class="value">3</div>
  <button type="button" onclick="setStart(1, true);">+</button>
</div>
<div>
  End 1:
  <button type="button" onclick="setEnd(1, false);">-</button>
  <div id="end-1" class="value">6</div>
  <button type="button" onclick="setEnd(1, true);">+</button>
</div>
<div>
  Start 2:
  <button type="button" onclick="setStart(2, false);">-</button>
  <div id="start-2" class="value">5</div>
  <button type="button" onclick="setStart(2, true);">+</button>
</div>
<div>
  End 2:
  <button type="button" onclick="setEnd(2, false);">-</button>
  <div id="end-2" class="value">8</div>
  <button type="button" onclick="setEnd(2, true);">+</button>
</div>
<div>
  Start 3:
  <button type="button" onclick="setStart(3, false);">-</button>
  <div id="start-3" class="value">2</div>
  <button type="button" onclick="setStart(3, true);">+</button>
</div>
<div>
  End 3:
  <button type="button" onclick="setEnd(3, false);">-</button>
  <div id="end-3" class="value">4</div>
  <button type="button" onclick="setEnd(3, true);">+</button>
</div>

我的问题:

1)我可以在defineProperty之后将我的属性的enumerable更新为true吗?

2)如果“不可枚举”键在没有if-statementfor-loop中定义为obj.all = {},我可以跳过它吗?

提前谢谢你。

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2017-02-23 00:04:28

Helper函数

代码语言:javascript
复制
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);
}

您可以像这样初始化对象

代码语言:javascript
复制
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;

甚至像这样

代码语言:javascript
复制
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
    }
});

来存储它

代码语言:javascript
复制
localStorage.setItem('testing', obj)

从存储中加载它

代码语言:javascript
复制
var obj2 = load(localStorage.getItem('testing'));

console.log(obj.toString() == obj2.toString());
// true
票数 1
EN

Stack Overflow用户

发布于 2017-02-22 22:55:37

Object.defineProperty()还可用于修改现有属性的描述符。对于您的用例,一个更好的方法是序列化原始对象的副本:

代码语言:javascript
复制
var open = {};
Object.assign(open, obj);
open.all = obj.all;
localStorage.setItem("localObj", JSON.stringify(open));
票数 1
EN

Stack Overflow用户

发布于 2017-02-22 23:15:47

正如在回答ccprog时提到的,我可以使用to Object.defineProperty()来修改我的对象属性。

代码语言:javascript
复制
var obj = {};
var name = "nonenumerable";
var value = "hello world";

Object.defineProperty(obj, name, {value: value,
  writable : true,
  enumerable : false,
  configurable : true
});

console.log(obj); 
//output in code snippet console: {}
//output in browser console: { nonenumerable: "hello world" }


Object.defineProperty(obj, name, {
  enumerable : true
});
console.log(obj);

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/42393494

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档