您的位置:首页 > Web前端 > JavaScript

JavaScript中对象属性的特性

2016-12-17 20:09 375 查看
JavaScript中对象的属性除了名字和值外,还包括一系列标识它们可写,可枚举,可配置的特性。

1,对象的属性描述符

[[Configuable]]:能否通过delete删除属性,或者修改属性描述符,重新配置对象的属性。
[[Enumerable]]:表示对象属性是否是可以枚举的。当把属性的特性enumerable修改成false时通过for in遍历对象的属性,不可以遍历到。
[[writable]]:表示是否可以修改属性的值。
[[value]]:属性的值。


当把[[Configuable]]修改成false之后,不可以通过delete删除属性。在非严格模式时,删除属性,什么也不会做,静默是失败的。在严格模式的时候,会报错。

当把[[configuable]]修改成false,除了[[writable]]外,别的属性描述符也不可以修改。但只可以把[[writable]]修改成false,不可以再修改成true。

ECMAScript 5中如果想要修改属性的特性,可以通过Object.definedProperty(),来达到目的。

Object.definedProperty(obj,s,{
writable:true,
value:"hello",
Configurable:true,
Enumerable:true
});
// 第一个参数:要修改的对象。
// 第二个参数:对象的属性。
// 第三个属性:一个映射表。


如果想要修改或设置对象的多个属性,可以通过Object.definedProperties().

Object.definedProperties(obj,{
x:{
value:1,
writable:true,
enumerable:true,
configurable:true
},
y:{
value:2,
writable:true,
enumerable:true,
configurable:true
}
})


通过Object.definedProperties()。可以一次添加,或设置多个属性。

我们直接在对象上定义的属性除了”value”外,其他的属性特性,默认都是true。

2,不变性

有时候你会希望属性或者对象是不可改变(无论有意还是无意)的,在 ES5 中可以通过很多种方法来实现。

很重要的一点是,所有的方法创建的都是浅不变形,也就是说,它们只会影响目标对象和它的直接属性。如果目标对象引用了其他对象(数组、对象、函数,等),其他对象的内容不受影响,仍然是可变的。

2.1 对象常量

结合 writable:false 和 configurable:false 就可以创建一个真正的常量属性(不可修改、重定义或者删除)。

2.2 禁止扩展

如果你想禁止一个对象添加新属性,并且保留已有属性,可以使用Object.preventExtensions()。

var myObject = {
a:2
};
Object.preventExtensions( myObject );
myObject.b = 3;
myObject.b; // undefined


在非严格模式下,会静默失败。在严格模式下,会报错。

2.3 密封

Object.seal(..) 会创建一个密封的对象,这个方法实际上会在一个现有对象上调用Object.preventExtensions(..) 并把所有现有属性标记为 configurable:false 。

所以,密封之后不仅不能添加新属性,也不能重新配置或者删除任何现有属性(虽然可以修改属性的值)。

2.4 冻结

Object.freeze(..) 会创建一个冻结对象,这个方法实际上会在一个现有对象上调用Object.seal(..) 并把所有数据访问属性标记为writable:false ,这样就无法修改它们的值。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: