Javascript定义属性与动态属性定义行为解释

Javascript定义属性与动态属性定义行为解释,javascript,readonly,Javascript,Readonly,Object.defineProperty(obj,'x',…)和obj.x之间有什么区别 从,在非严格模式下: var obj = { }; Object.preventExtensions(obj); Object.defineProperty(obj, 'x', { value: "foo" } ); 抛出错误无法添加属性x,对象不可扩展。但是obj.x='foo'不会抛出任何错误。我不明白行为上的区别 这两种技术都行不通。 您所看到的只是,试图对调用了.preventExt

Object.defineProperty(obj,'x',…)
obj.x
之间有什么区别

从,在非严格模式下:

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

Object.defineProperty(obj, 
  'x', { value: "foo" }
);
抛出错误无法添加属性x,对象不可扩展。但是
obj.x='foo'
不会抛出任何错误。我不明白行为上的区别

这两种技术都行不通。 您所看到的只是,试图对调用了
.preventExtensions
的对象调用
.defineProperty
会抛出错误,当您使用
obj.x=foo
的隐式语法时,它会自动失败。当您不处于严格模式时,静默故障经常发生,这是
使用严格模式的主要好处之一

许多静态
对象
方法(
.preventExtensions
.freeze
.seal
,等等)都是在ES 2015中与
“use strict”
一起添加的,以帮助将JavaScript带入现代时代。有了这些新功能,我们就越来越远离JavaScript自一开始就存在的一些本机行为

“使用严格的”
var obj={};
对象扩展(obj);
//无论您处于何种模式,这都不起作用。“严于律己”的意志
//至少让它抛出一个错误,而不是默默地失败。

obj.x=“foo”如果可以向对象添加新属性,则该对象是可扩展的
Object.preventExtensions()
将对象标记为不再可扩展,这样它的属性将永远不会超过它被标记为不可扩展时的属性。请注意,通常,不可扩展对象的属性仍可能被删除。尝试向不可扩展对象添加新属性将失败,以静默方式或通过抛出
类型错误
(在
严格
模式下最常见,但不是唯一的方式)。

但它实际上并没有添加新属性+1,正如您提到的,分配似乎以静默方式失败。我检查了obj.x的值,它显示未定义。我检查了Object.getOwnPropertyNames(obj)和Object.keys(obj)以进行验证。它们都不显示“x”属性。@RandomInstanceFlivingThing完全相同。我上面的代码片段也显示了这一点。它只是在严格模式下执行,因此您不必追查未定义的值。