文章目录
- 前言
- 字符串只读
- 设置对象属性只读
- 1、Object.freeze 全部属性
- 2、Object.defineProperty 指定属性
前言
- 将对象或者对象属性设置成只读,让其在发生修改时报错,可以更快的定位更改的代码位置;
字符串只读
- 使用 Object.freeze 冻结字符串是没有效果的,因为字符串赋值会将地址换掉。
const some_str = 'abc';
some_str = 'hello';
设置对象属性只读
1、Object.freeze 全部属性
- 非严格模式时,冻结对象后对象已有的属性不能修改;且不能新增属性;但是对已有属性使用等号赋值和新增属性都不会报错;
- 如果需要报错则可以使用 Object.defineProperty ;
- 如果对对象整体重新赋值,冻结效果失效。因为对象的地址换掉了。
let some_obj = {name: 'hello'};
console.log(some_obj);
some_obj.name='world';
console.log(some_obj);
Object.freeze(some_obj)
some_obj.name='freeze world';
console.log(some_obj);
some_obj.age= 18;
console.log(some_obj);
some_obj = {age: 18};
some_obj.sex = 0;
console.log(some_obj);
- 严格模式时:但是对已有属性使用等号赋值和新增属性都会报错; Object.defineProperty 设置属性值也会报错;
- 如果对对象整体重新赋值,冻结效果失效。
"use strict";
let some_obj = {name: 'hello'};
console.log(some_obj);
some_obj.name='world';
console.log(some_obj);
Object.freeze(some_obj)some_obj.name='freeze world';
console.log(some_obj); some_obj.age= 18;
console.log(some_obj);
some_obj = {age: 18};
some_obj.sex = 0;
console.log(some_obj);
2、Object.defineProperty 指定属性
- 设置对象的某个属性只读;
- 可以添加新属性,已经存在的旧属性,不能修改属性值。非严格模式时,对其进行赋值也不报错;
- 如果需要报错使用 Object.defineProperty, 需要注意的是。对应得value 值要进行修改,才会报错,不然也是不报错运行完成。
let some_obj = {name: 'hello'};
console.log(some_obj);
some_obj.name='world';
console.log(some_obj); Object.defineProperty(some_obj, 'name',{value: 'define',enumerable: true,writable: false,configurable: false
});
some_obj.name='freeze world';
console.log(some_obj);
some_obj.age= 18;
console.log(some_obj);
Object.defineProperty(some_obj, 'sex',{value: 0,enumerable: true,});
console.log(some_obj);
some_obj = {age: 18};
some_obj.sex = 0;
console.log(some_obj);
- 严格模式时:
- 对只读属性进行赋值会报错;
- 严格模式时,使用 Object.defineProperty,对应得value 值也需要进行修改,才会报错,不然也是不报错运行完成。
"use strict";
let some_obj = {name: 'hello'};
console.log(some_obj);
some_obj.name='world';
console.log(some_obj); Object.defineProperty(some_obj, 'name',{value: 'define',enumerable: true,writable: false,configurable: false
});
console.log(some_obj);
some_obj.age= 18;
console.log(some_obj);
Object.defineProperty(some_obj, 'sex',{value: 0,enumerable: true,});
console.log(some_obj); some_obj = {age: 18};
some_obj.sex = 0;
console.log(some_obj);