Javascript defineProperty与动态属性定义行为的解释

问题描述 投票:2回答:2

Object.defineProperty(obj, 'x', ...)obj.x有什么区别?

来自MDN,非严格模式:

var obj = { }; 
Object.preventExtensions(obj); 

Object.defineProperty(obj, 
  'x', { value: "foo" }
);

抛出错误无法添加属性x,对象不可扩展。但obj.x = 'foo'不会抛出任何错误。我不明白行为上的差异。

javascript readonly
2个回答
3
投票

这两种技术都不会起作用。

您所看到的只是尝试在.defineProperty上调用它的对象上调用.preventExtensions,抛出错误,当您使用obj.x = foo的隐式语法时,它会无声地失败。当你没有处于严格模式时,非常频繁的失败发生,这是"use strict"的主要好处之一。

许多静态Object方法(.preventExtensions.freeze.seal等)与ES 2015以及"use strict"一起添加,以帮助JavaScript进入现代时代。借助这些新功能,我们可以从一开始就使用JavaScript的一些本机行为越来越远。

"use strict"
var obj = { }; 
Object.preventExtensions(obj); 

// This won't work no matter what mode your in. "use strict" will
// at least make it throw an error rather than silently fail.
obj.x = "foo";

此外,使用.defineProperty,除了其值之外,您还可以配置3个关于该属性的其他内容:

  • 配置
  • 枚举

当您使用object.property = foo创建新属性时,您只需设置该值并获取其他3个配置的默认值。


0
投票

如果可以向其添加新属性,则对象是可扩展的。 Object.preventExtensions()将一个对象标记为不再可扩展,因此它永远不会具有超出它被标记为不可扩展时的属性。请注意,通常,仍可以删除不可扩展对象的属性。尝试向不可扩展的对象添加新属性将失败,无论是静默还是通过抛出TypeError(最常见,但不是唯一的,在strict模式下)。

© www.soinside.com 2019 - 2024. All rights reserved.