我正在尝试了解JS中的对象变异是如何工作的。我遇到了JS中的可写属性。
var x = {name:'JohnSnow'};
Object.defineProperty(x, 'name', {
writable: false
};
现在更改name
属性对对象x
没有影响。这是可以理解的,因为我已将其writable
属性更改为false
。
然而,我阅读过的所有文档,包括(https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Object/defineProperties#Parameters)都说此属性默认为false
。
如果writable
默认设置为false
,那么对象不应该默认是不可变的,并且只有在将writable
设置为true
后才能变为可变的。
我是否在理解对象属性的概念方面错了,因为我认为JS中的所有对象都具有此config
,并且每个对象都具有writable
属性。
Object.defineProperty
修改现有属性,如问题中所示,而不是定义或重新定义一个新属性时,它将不会像writable: false
一样起作用。 - Ry-defineProperty
或defineProperties
方法时,整个对象配置概念才会出现在画面中。 - Saurabh TiwariObject.getOwnPropertyDescriptor(x, 'name')
而没有任何defineProperties
。默认值取决于情况。例如,当您在对象字面量中使用普通属性或使用=
分配新属性时,该属性是可写的和枚举的。但是如果您使用class
定义了一个类,则来自其中方法的原型上的属性是可写的但*不可枚举的。 - Ry-