JavaScript DefineProperty vs动态属性定义行为说明



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模式下(。

>

最新更新