我在新的ES5特性上读了John的一个博客,其中一个是Object描述符。约翰在博客的早些时候写道:
这三个属性(可写属性、可枚举属性和可配置属性)都是可选的,并且都默认为true。因此,您需要提供的唯一属性是值或get和set。
稍后,他提供了一个例子:
var obj = {};
Object.defineProperty( obj, "propertyname", {
value: true,
writable: false,
enumerable: true,
configurable: true
});
(function() {
var name = "John";
Object.defineProperty( obj, "name", {
get: function(){ return name; },
set: function(value){ name = value; }
});
})();但是,当检查name的属性描述符时,它是不可配置的或可枚举的,因此我无法在for循环中访问它。
console.log(Object.getOwnPropertyDescriptor(obj, 'name'))
> Object {enumerable: false, configurable: false}name不应该是可枚举的和可配置的吗?我在这里错过了什么?
发布于 2017-01-18 00:55:03
描述符属性的默认值为false或未定义。
这个博客有个错误。除非在描述符中显式定义,否则enumerable/configurable/writable将是false,value将是undefined。访问描述符属性也将默认为undefined。
这是与MDN 备注并发的。
数据描述符和访问描述符都是对象。它们共享以下所需的密钥: 可配置 当且仅当此属性描述符的类型可能被更改,以及该属性可能从相应的对象中删除时,则为true。默认为false。 可枚举 当且仅当此属性在相应对象的属性枚举过程中出现时为true。默认为false。 数据描述符还具有以下可选键: 值 与属性关联的值。可以是任何有效的JavaScript值(数字、对象、函数等)。默认为未定义。 可写 当且仅当与该属性关联的值可能与赋值运算符发生更改时,则为true。默认为false。 访问器描述符还具有以下可选键: get 用作属性的getter的函数,如果没有getter,则为未定义的函数。函数返回将用作属性值。默认为未定义。 集 用作属性的setter的函数,如果没有setter,则为未定义的函数。该函数将只作为参数接收分配给该属性的新值。默认为未定义。
发布于 2017-01-18 01:28:32
在规格中,数据属性在默认情况下是不可配置的、不可枚举的和不可写的.
如果该规范未显式指定属性的初始值,则使用表4中定义的默认值。 表4:默认属性值 ┌──────────────────┬─────────────────┐│属性名称│默认值│├──────────────────┼─────────────────┤│[ Value ]│未定义││[Get]│未定义││[Set]│未定义││[可写入]│false││[枚举]│false││[可配置]│false│└──────────────────┴─────────────────┘
但是,当您通过赋值创建数据属性时,CreateDataProperty将其定义为可配置、可枚举和可写。
设newDesc是PropertyDescriptor{[Value]:V,[Writable]:true,[PropertyDescriptor]:true,[Configurable]:true}。
https://stackoverflow.com/questions/41707191
复制相似问题