在默认情况下可枚举设置为 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 中创建对象属性的其他方法是啥?的主要内容,如果未能解决你的问题,请参考以下文章

默认情况下,将jTextArea设置为可见的false

Sonata admin:默认情况下将过滤器设置为 false?

powershell ParameterSet解析

JS中各种变量类型在条件判断为false的情况

js中return;return truereturn false;区别

默认情况下可与大多数防火墙一起使用的 Websocket 配置