静态网站漏洞,做门户网站长沙社区赚钱吗,技能培训班有哪些课程,wordpress下载文件Object.defineProperty是一个用于定义或修改对象属性的方法。它提供了一种更底层和灵活的方式来定义属性#xff0c;可以设置属性的配置#xff08;如可枚举性、可配置性、可写性等#xff09;#xff0c;并且可以定义属性的getter和setter函数。
语法#xff1a;
Objec… Object.defineProperty是一个用于定义或修改对象属性的方法。它提供了一种更底层和灵活的方式来定义属性可以设置属性的配置如可枚举性、可配置性、可写性等并且可以定义属性的getter和setter函数。
语法
Object.defineProperty(obj, prop, descriptor) 参数说明 - obj要定义属性的对象 - prop要定义或修改的属性名称。 - descriptor一个描述符对象用于定义或修改属性的特性。它有以下可选的键值 - value属性的值默认为undefined。 - writable属性的可写性。默认为false即该属性为只读属性。 - enumerable属性的可枚举性。默认为false即该属性不可枚举。 - configurable属性的可配置性。默认为false即该属性不可被删除。 - get获取属性值的函数。 - set设置属性值的函数。 直接看代码
没有设置writable、enumerable、configurable属性默认都为falseage属性不可枚举不可修改不可删除。 let person {name: 张三,sex: 男,};Object.defineProperty(person, age, {value: 18,})console.log(person); // {name: 张三, sex: 男, age: 18}for (p in person) { // 这里由于Object.defineProperty中没有设置enumerable:true所以age属性不会参与枚举遍历console.log(p);// name// sex}person.age 19; // 这里由于Object.defineProperty中没有设置writable:true所以修改不会生效console.log(person); // {name: 张三, sex: 男, age: 18}delete person.age; // 这里由于Object.defineProperty中没有设置configurable:true所以删除不会生效console.log(person); // {name: 张三, sex: 男, age: 18}
此时修改是person对象上的age值是无效的值实际上没有更新 设置了writable、enumerable、configurable属性的值为true之后age属性可以被枚举可以被修改可以被删除。 let person {name: 张三,sex: 男,};Object.defineProperty(person, age, {value: 18,enumerable: true, //控制属性是否可以枚举默认值是falsewritable: true, //控制属性是否可以被修改默认值是falseconfigurable: true, //控制属性是否可以被删除默认值是false});console.log(person); // {name: 张三, sex: 男, age: 18}for (p in person) {// 这里由于Object.defineProperty中设置了enumerable:true所以age属性参与了枚举遍历console.log(p);// name// sex// age}person.age 19; // 这里由于Object.defineProperty中设置了writable:true所以修改生效了console.log(person); // {name: 张三, sex: 男, age: 19}delete person.age; // 这里由于Object.defineProperty中设置了configurable:true所以删除生效了console.log(person); // {name: 张三, sex: 男} Object.defineProperty 还可以设置getter和setter方法
let number 18;
let person {name: 张三,sex: 男,
};
// 此外 Object.defineProperty 还可以设置getter和setter方法
Object.defineProperty(person, age, {// value:18,// enumerable:true, //控制属性是否可以枚举默认值是false// writable:true, //控制属性是否可以被修改默认值是false// configurable:true, //控制属性是否可以被删除默认值是false//当有人读取person的age属性时get函数(getter)就会被调用且返回值就是age的值get() {console.log(有人读取age属性了);return number;},//当有人修改person的age属性时set函数(setter)就会被调用且会收到修改的具体值set(value) {console.log(有人修改了age属性且值是, value);number value;},
});console.log(person, person);
console.log(number, number); 注意事项 Object.defineProperty() 设置了getter和setter方法之后就不能再设置value属性否则控制台报错Uncaught TypeError: Invalid property descriptor. Cannot both specify accessors and a value or writable attribute, #Object