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
模式).
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
模式).