1. 这个方法是ES5新增的。
2. 这个方法的作用是:给对象新增属性,或者设置对象原有的属性。
3. 怎么用?
Object.defineProperty(给哪个对象新增属性, '新增的这个属性名叫啥', {给新增的属性设置相关的配置项key:value对})
4. 第三个参数是属性相关的配置项,配置项都有哪些?每个配置项的作用是啥?
- value 配置项:给属性指定值
- writable 配置项:设置该属性的值是否可以被修改。true表示可以修改。false表示不能修改。
- enumerable 配置项:设置该属性是否可以被遍历。
-
- true表示该属性是可以遍历的。(可枚举的,可迭代的。)
- false表示该属性是不可遍历的。
- configurable 配置项:设置该属性是否被删除。
-
- true表示该属性是可以被删除的。
- false表示该属性不可以被删除
- getter方法 配置项:不需要我们手动调用的。当读取属性值的时候,getter方法被自动调用。
getter方法的返回值非常重要,这个返回值就代表读取的这个属性它的值。
- setter方法 配置项:不需要我们手动调用的。当修改属性值的时候,setter方法被自动调用。
setter方法上是有一个参数的,这个参数可以接收传过来的值。
注意:当配置项当中有setter和getter的时候,value和writable配置项都不能存在。
示例代码:
<body>
<script>
// 这是一个普通的对象
let person = {};
// 临时变量
let temp;
// 给上面的phone对象新增一个color属性
Object.defineProperty(person, "name", {
//value : '章三',
//writable : true,
enumerable: false,
// true表示该属性是可以遍历的。(可枚举的,可迭代的。)
// false表示该属性是不可遍历的。
configurable: false,
// true表示该属性是可以被删除的。
// false表示该属性是不可以被删除的。
// getter方法配置项
get: function () {
console.log("getter方法执行了@@@");
//return '动态'
//return this.name //递归,死循环
return temp;
},
// setter方法配置项
set: function (val) {
console.log("setter方法执行了@@@", val);
//this.name = val //递归,死循环
temp = val;
},
});
</script>
</body>