Open sworlife opened 3 years ago
对象的几个特点 • 对象具有唯一标识性:即使完全相同的两个对象,也并非同一个对象 • 对象有状态:对象具有状态,同一对象可能处于不同状态之下 • 对象具有行为:即对象的状态,可能因为它的行为产生变迁
对象的两类属性
数据属性
访问器属性
查看和定义属性特征
Object.getOwnPropertyDescriptor
Object.defineProperty
对象的属性访问和设置
[[Get]] 在语言规范中,myObject.a 在 myObject 的属性访问实际是调用了 [[Get]] 操作。对象默认的内置 [[Get]] 操作首先在对象中查找是否有名称相同的属性,如果找到就会返回这个属性的值。如果没有找到,按照 [[Get]] 算法的定义会遍历可能存在的 [[Prototype]] 链(原型链),在整个原型链中如果也没找到,[[Get]] 操作就会返回 undefined。
[[Put]] 考虑代码:myObject.foo = 'bar';[[Put]] 算法如下:
流程图表示如下:
对象的不变性
对象常量 结合writable:false 和 configurable:false 就可以创建一个真正的常量属性(不可修改、重定义或者删除)
var myObject = {}; Object.defineProperty( myObject, "FAVORITE_NUMBER", { value: 42, writable: false, configurable: false } );
禁止扩展 使用 Object.preventExtensions( .. ) 来禁止对象添加新属性,并且保留已有属性。但,无法禁止删除属性。
var myObject = { a:2 }; Object.preventExtensions( myObject ); myObject.b = 3; myObject.b; // undefined
密封 使用 Object.seal( .. ) 来密封对象,密封之后的对象不能添加新属性,也不能重新配置或者删除任何现有属性(可以修改属性值),这个方法实际是调用 Object.preventExtensions( .. ) 并把所有现有属性标记为 configurable:false。
冻结 使用 Object.freeze( .. ) 来冻结对象,冻结可理解为最高级别的不可变性,会禁止对于对象本身及其任意直接属性的修改。这个方法实际是调用 Object.seal( .. ) 并把所有“数据访问”属性标记为 writable:false。
就补充个测试,Object.defineProperty,Object.seal( .. ),Object.freeze( .. ) 来处理对象属性不可变时,都是针对属性类型为值类型的才能不变,对于属性是引用类型的,仍是可变的(不变的是地址的引用)
JavaScript 对象
对象的几个特点 • 对象具有唯一标识性:即使完全相同的两个对象,也并非同一个对象 • 对象有状态:对象具有状态,同一对象可能处于不同状态之下 • 对象具有行为:即对象的状态,可能因为它的行为产生变迁
对象的两类属性
数据属性
访问器属性
查看和定义属性特征
Object.getOwnPropertyDescriptor
Object.defineProperty
对象的属性访问和设置
[[Get]] 在语言规范中,myObject.a 在 myObject 的属性访问实际是调用了 [[Get]] 操作。对象默认的内置 [[Get]] 操作首先在对象中查找是否有名称相同的属性,如果找到就会返回这个属性的值。如果没有找到,按照 [[Get]] 算法的定义会遍历可能存在的 [[Prototype]] 链(原型链),在整个原型链中如果也没找到,[[Get]] 操作就会返回 undefined。
[[Put]] 考虑代码:myObject.foo = 'bar';[[Put]] 算法如下:
流程图表示如下:
对象的不变性
对象常量 结合writable:false 和 configurable:false 就可以创建一个真正的常量属性(不可修改、重定义或者删除)
禁止扩展 使用 Object.preventExtensions( .. ) 来禁止对象添加新属性,并且保留已有属性。但,无法禁止删除属性。
密封 使用 Object.seal( .. ) 来密封对象,密封之后的对象不能添加新属性,也不能重新配置或者删除任何现有属性(可以修改属性值),这个方法实际是调用 Object.preventExtensions( .. ) 并把所有现有属性标记为 configurable:false。
冻结 使用 Object.freeze( .. ) 来冻结对象,冻结可理解为最高级别的不可变性,会禁止对于对象本身及其任意直接属性的修改。这个方法实际是调用 Object.seal( .. ) 并把所有“数据访问”属性标记为 writable:false。