JavaScript中对象属性的特性
2016-12-17 20:09
375 查看
JavaScript中对象的属性除了名字和值外,还包括一系列标识它们可写,可枚举,可配置的特性。
当把[[Configuable]]修改成false之后,不可以通过delete删除属性。在非严格模式时,删除属性,什么也不会做,静默是失败的。在严格模式的时候,会报错。
当把[[configuable]]修改成false,除了[[writable]]外,别的属性描述符也不可以修改。但只可以把[[writable]]修改成false,不可以再修改成true。
ECMAScript 5中如果想要修改属性的特性,可以通过Object.definedProperty(),来达到目的。
如果想要修改或设置对象的多个属性,可以通过Object.definedProperties().
通过Object.definedProperties()。可以一次添加,或设置多个属性。
我们直接在对象上定义的属性除了”value”外,其他的属性特性,默认都是true。
很重要的一点是,所有的方法创建的都是浅不变形,也就是说,它们只会影响目标对象和它的直接属性。如果目标对象引用了其他对象(数组、对象、函数,等),其他对象的内容不受影响,仍然是可变的。
在非严格模式下,会静默失败。在严格模式下,会报错。
所以,密封之后不仅不能添加新属性,也不能重新配置或者删除任何现有属性(虽然可以修改属性的值)。
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 ,这样就无法修改它们的值。相关文章推荐
- javascript 理解对象--- 定义多个属性和读取属性的特性
- javascript学习(九)对象属性的特性
- JavaScript delete用法,属性,特性,执行上下文,激活对象 综合篇
- JavaScript中的高级特性及特别对象、属性和方法
- JavaScript中的高级特性及特别对象、属性和方法
- JavaScript之面向对象的概念,对象属性和对象属性的特性简介
- javascript中对象的属性的特性
- javascript中的对象属性类型与特性总结
- JavaScript中的高级特性及特别对象、属性和方法
- Javascript中的高级特性及特别对象、属性和方法
- javascript中对象的属性的特性
- javascript中对象的属性的特性
- javascript中对象的属性的特性
- Javascript中的高级特性及特别对象、属性和方法
- JavaScript之再谈对象之属性的特性
- javascript小技巧&&JavaScript[对象.属性]集锦 [转载了多篇]
- javascript小技巧&&JavaScript[对象.属性]集锦
- JavaScript的OO特性:类与对象
- JavaScript[对象.属性]集锦
- javascript小技巧&&JavaScript[对象.属性]集锦