JavaScript描述符:默认情况下可枚举/可配置/可写不正确?
我在上读了John Resig的一个博客,其中一个是JavaScript描述符:默认情况下可枚举/可配置/可写不正确?,javascript,descriptor,Javascript,Descriptor,我在上读了John Resig的一个博客,其中一个是Object描述符。约翰在他的博客早些时候写道: 这三个属性(可写、可枚举和可配置)都是 可选,所有默认值均为true。因此,您将看到的唯一属性 需要提供的将是value或get和set 随后,他举了一个例子: var obj = {}; Object.defineProperty( obj, "propertyname", { value: true, writable: false, enumerable: tru
Object
描述符。约翰在他的博客早些时候写道:
这三个属性(可写、可枚举和可配置)都是
可选,所有默认值均为true。因此,您将看到的唯一属性
需要提供的将是value或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
不应该既可枚举又可配置吗?这里缺少什么?描述符属性的默认值为false或未定义。
该博客有一个错误。除非在描述符中明确定义,可枚举
/可配置
/可写
将为假
,值
将为未定义
。访问器描述符属性也默认为未定义
这与MDN同步:
数据描述符和访问器描述符都是对象。它们共享以下必需的密钥:
可配置
当且仅当此属性描述符的类型为
可以更改,并且如果可以从
对应对象。默认为false
可枚举的
当且仅当此属性在相应对象上的属性枚举期间显示时,为true。默认为false
数据描述符还具有以下可选键:
值
与属性关联的值。可以是任何有效的
JavaScript值(数字、对象、函数等)。默认为
未定义
可写
当且仅当与
属性可以使用赋值运算符进行更改。默认为
错
访问器描述符还具有以下可选键:
获取
用作属性或未定义属性的getter的函数
如果没有getter。函数return将用作值
财产。默认为未定义
设置
作为一个函数的函数
属性的setter,如果没有setter,则为未定义。这个
函数将作为唯一参数接收分配给的新值
财产。默认为未定义
从中,默认情况下,数据属性是不可配置、不可枚举和不可写的
如果属性属性的初始值不是显式的
根据本规范指定,将使用中定义的默认值
表4:默认属性值
┌──────────────────┬─────────────────┐
│ Attribute Name │ Default Value │
├──────────────────┼─────────────────┤
│ [[Value]] │ undefined │
│ [[Get]] │ undefined │
│ [[Set]] │ undefined │
│ [[Writable]] │ false │
│ [[Enumerable]] │ false │
│ [[Configurable]] │ false │
└──────────────────┴─────────────────┘
但是,当您通过赋值创建数据属性时,会将其定义为可配置、可枚举和可写
设newDesc为PropertyDescriptor{[[Value]]:V,[[Writable]]:
true,[[Enumerable]]:true,[[Configurable]]:true}
当使用
对象时,默认值实际上是false
。defineProperty
,由文字/赋值创建的“普通”道具的默认值是true
。我认为这简化了为这种动态道具编写默认代码的过程。看看var obj={};defineProperty(obj,“propertyname”,{value:true});getOwnPropertyDescriptor(obj,“propertyname”)代码>用于检查是否正常。该博客出错。当使用对象时,默认值为false
。defineProperty
@dandavis您的意思是:如果在描述符中指定属性的值,那么其他属性将自动设置为true?刚刚测试了上述内容--其他属性仍然为false。无论如何,你们都是正确的:除非在描述符中明确定义,否则可枚举/可配置/可写将为false,值将为未定义。您引用的引用必须至少有五年历史,并且可能是在规范仍然不稳定的时间点编写的。