【发布时间】:2017-06-02 02:38:02
【问题描述】:
我正在阅读 John Resig 在 new ES5 features 上的一篇博客,其中一篇是 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 不应该既可枚举又可配置?我在这里错过了什么?
【问题讨论】:
-
在使用
Object.defineProperty时,默认值实际上是false,它是true用于由文字/赋值创建的“普通”道具。我认为这简化了此类动态道具的通常默认值的编码。查看var obj = {}; Object.defineProperty( obj, "propertyname", { value: true});Object.getOwnPropertyDescriptor(obj, 'propertyname');进行完整性检查。 -
博客写错了。使用
Object.defineProperty时默认为false。 -
@dandavis 你是说:如果你在其描述符中分配一个属性的值,那么其他属性将自动设置为 true?
-
刚刚测试了上面的——其他属性仍然是假的。无论如何,你们都是正确的:除非在描述符中明确定义,否则 enumerable/configurable/writable 将是 false 并且 value 将是未定义的。
-
您引用的参考文献必须至少有 5 年的历史,并且可能是在规范尚未确定的时间点编写的。
标签: javascript descriptor