Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/asp.net-mvc-3/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
JavaScript描述符:默认情况下可枚举/可配置/可写不正确?_Javascript_Descriptor - Fatal编程技术网

JavaScript描述符:默认情况下可枚举/可配置/可写不正确?

JavaScript描述符:默认情况下可枚举/可配置/可写不正确?,javascript,descriptor,Javascript,Descriptor,我在上读了John Resig的一个博客,其中一个是Object描述符。约翰在他的博客早些时候写道: 这三个属性(可写、可枚举和可配置)都是 可选,所有默认值均为true。因此,您将看到的唯一属性 需要提供的将是value或get和set 随后,他举了一个例子: var obj = {}; Object.defineProperty( obj, "propertyname", { value: true, writable: false, enumerable: tru

我在上读了John Resig的一个博客,其中一个是
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,值将为未定义。您引用的引用必须至少有五年历史,并且可能是在规范仍然不稳定的时间点编写的。