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完全相同。我上面的代码片段也显示了这一点。它只是在严格模式下执行,因此您不必追查未定义的值。