在默认情况下可枚举设置为 false 的 JS 中创建对象属性的其他方法是啥?
Posted
技术标签:
【中文标题】在默认情况下可枚举设置为 false 的 JS 中创建对象属性的其他方法是啥?【英文标题】:What are other ways of creating object properties in JS with enumerable set to false by default?在默认情况下可枚举设置为 false 的 JS 中创建对象属性的其他方法是什么? 【发布时间】:2016-05-25 11:55:22 【问题描述】:可枚举属性是那些其内部 [[Enumerable]] 标志设置为 true 的属性,这是通过简单赋值或属性初始化程序创建的属性的默认值(通过 Object.defineProperty 定义的属性等 默认 [[Enumerable]] 为 false)。
var person = new Object();
//person = "hair": "red", "eyes": "blue";
Object.defineProperty(person, "gender", value: "male");
Object.defineProperty(person, "name", value: "Joe");
for (var prop in person)
console.log(prop + " = " + person[prop]);
这不会产生任何结果,甚至不会产生错误,因为可枚举项设置为 false。把简单赋值注释掉,把defineProperty注释掉,就会产生
"hair": "red", "eyes": "blue".
MDN 说“... 等等”,对我来说,Object.defineProperty 是创建属性的唯一方法,默认情况下可枚举设置为 false。
PS。我可能应该重新措辞一下。当我执行 new Object() 时,它的 enumerable 属性默认设置为 false,所以当我执行 Object.defineProperty() 时,我没有触及 enumerable 属性,它仍然是 false。但是当您随后进行简单的分配时,可枚举设置为 true。
【问题讨论】:
【参考方案1】:据我所知,使用 Object.defineProperty 是修改可枚举标志的唯一方法。在 ES5 之前,我们没有这样的机制。
【讨论】:
Object.defineProperty() 可能是修改可枚举标志的唯一方法。当我创建 new Object() 时,它的可枚举属性将设置为 false。所以当我做了 defineProperty() 时,我没有触及可枚举,它们仍然是假的。以上是关于在默认情况下可枚举设置为 false 的 JS 中创建对象属性的其他方法是啥?的主要内容,如果未能解决你的问题,请参考以下文章
Sonata admin:默认情况下将过滤器设置为 false?