Object.defineProperty(obj, 'x', ...)
和obj.x
有什么区别?
来自MDN,非严格模式:
var obj = { };
Object.preventExtensions(obj);
Object.defineProperty(obj,
'x', { value: "foo" }
);
抛出错误无法添加属性x,对象不可扩展。但obj.x = 'foo'
不会抛出任何错误。我不明白行为上的差异。
您所看到的只是尝试在.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个配置的默认值。
如果可以向其添加新属性,则对象是可扩展的。 Object.preventExtensions()
将一个对象标记为不再可扩展,因此它永远不会具有超出它被标记为不可扩展时的属性。请注意,通常,仍可以删除不可扩展对象的属性。尝试向不可扩展的对象添加新属性将失败,无论是静默还是通过抛出TypeError
(最常见,但不是唯一的,在strict
模式下)。