Object.defineProperty(obj, 'x', ...)
和 obj.x
有什么区别?
来自mdn,in non-strict 模式:
var obj = { };
Object.preventExtensions(obj);
Object.defineProperty(obj,
'x', { value: "foo" }
);
引发错误无法添加属性X,对象不是可扩展的。但是obj.x = 'foo'
不会丢任何错误。我不明白行为的差异。
您所看到的仅仅是试图在带有.preventExtensions
的对象上调用.defineProperty
,抛出错误,并且当您使用obj.x = foo
的隐式语法时,它会默默失败。当您处于严格模式时,无声故障经常发生,这是"use strict"
的主要好处之一。
与ES 2015一起添加了许多静态Object
方法(.preventExtensions
,.freeze
,.seal
等(以及"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()
将一个对象标记为不再可扩展的对象,因此它永远不会具有超出其标记为不可扩展性的对象。请注意,通常仍可以删除不可扩展对象的属性。试图将新属性添加到不可扩展的对象将失败, silsy 或通过扔TypeError
(最常见但不完全是在strict
模式下(。