一、涉及内容
Object.defineProperty(obj, prop, descriptor);
Object.defineProperties(obj, props);
Object.preventExtensions(obj);
二、详解
(1)、Object.defineProperty(obj, prop, descriptor)
- obj:要定义或修改属性的对象
- prop:要定义或修改的属性名,值为一个字符串或Symbol
- descriptor:描述符对象,包括:
- value:数据描述符,默认值为undefined;属性值,任何有效的JavaScript值(数字、函数、对象等)
- writable:数据描述符,默认值为false,为false时,value不可被更改;为true时,可被更改
- configurable:属性描述符,默认值为false,为false时,不可删除该属性、不可更改其他属性描述符(writable 若为true,则value可被更改,writable 可被改为false)
- enumerable:属性描述符,默认值为false,为false时,不可被Object.assign()操作、不会出现在Object.keys()的结果中;为true时,反之
- get 访问器描述符,默认值为undefined,用作属性getter的函数,没有getter则为undefined,访问属性时,会不带参的调用该函数,返回值用做属性值
- set 访问器描述符,默认值为undefined,用作属性setter的函数,没有setter则为undefined,属性被赋值时,将携带一个赋值给属性值的参数调用该函数(在此时写一些操作,即完成了对属性值的监听处理功能)
- 注:若已经设置set或get,则不能设置数据描述符 value、writable了,因为关于value的操作都已经被set或get代理了
(2)Object.defineProperties(obj, props) 同时定义或修改对象的多个属性
- obj:要定义或修改属性的对象
- prop:对象类型,每个键都表示要定义或修改的属性名,每个值是描述该属性的对象
- 示例:
let person = {}; Object.defineProperties(person, { name: { value:'xiaohong', configurable: true, writable: false, enumerable: true }, sex: { configurable: false, enumerable: true, get: function(){ return this._value; }, set: function(value){ this._value = value; } });
(3) Object.preventExtensions(obj) 防止修改对象
let person = {};
Object.defineProperty(person, 'name', { value: 'xiaohong' });
Object.preventExtensions(person);