Javascript defineProperty vs dynamic 属性 定义行为解释

Javascript defineProperty vs dynamic property definition behavior explanation

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

来自 MDN,在 非严格 模式下:

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

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

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

这两种方法都行不通。

你所看到的只是试图在一个已经调用了 .preventExtensions 的对象上调用 .defineProperty,抛出一个错误,当你使用 [=13= 的隐式语法时],它默默地失败了。当您不处于严格模式时,静默失败会经常发生,这是 "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 个配置的默认值。

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