先说说它的语法
Object.defineProperty(obj, prop, descriptor)
obj:必需。目标对象
prop:必需。需定义或修改的属性的名字
descriptor:必需。目标属性所拥有的特性>
先看一个小例子
// 我这样写
let params = {
name:'张三',
sex:"男",
age:20
}
//跟这样写的区别
let params = {
name:'张三',
sex:"男",
}
Object.defineProperty(params,'age',{
value: 12
})
仔细看第一个params 打印跟第二个params 打印的区别在age这个颜色,而第一个params 是可以写,改,删等操作(可以在控制台试试),而第二个params 是可以被写,改,删除
writable:true,
属性的值是否可以被重写。设置为true可以被重写;设置为false,不能被重写。默认为false
enumerable:true,
此属性是否可以被枚举(使用for…in或Object.keys())。设置为true可以被枚举;设置为false,不能被枚举。默认为false
configurable:true,
是否可以删除目标属性或是否可以再次修改属性的特性(writable, configurable, enumerable)。
设置为true可以被删除或可以重新设置特性;设置为false,不能被可以被删除或不可以重新设置特性。默认为false
先不说其他的
在看看下面的代码
let num = 10
// 第一个params
let params = {
name:'张三',
sex:"男",
age:num
}
//第二个params
let params = {
name:'张三',
sex:"男",
}
Object.defineProperty(params,'age',{
value: num
})
我提一个小小的需求,我想把这个num 的值根据我value的值变化而变化 (注意不是value的值根据num的变化而变化),对 它有两个属性函数
get(getter) :是一种获得属性值的方法
set(setter):是一种设置属性值的方法。
let num = 10
let params = {
name:'张三',
sex:"男"
}
Object.defineProperty(params,'age',{
get(){ //
},
set(){
}
})
当你加上get(),set() 这两个函数的时候 在控制台打印
let num = 10
let params = {
name:'张三',
sex:"男"
}
Object.defineProperty(params,'age',{
get(){
return num //这里将num的值设置为age:num
},
set(val){ // 这里会拿到修改的值
num = val // 将最新的值赋值给num 怎么num 也会根据你设置的值自动进行修改 称为数据代理
//何为数据代理 通过一个对象(或者)其他对另一个对象中属性的操作(读/写)
}
})
那么再来一个小题目(请仔细审题)
什么样的 a 可以满足 (a === 1 && a === 2 && a === 3) === true 呢?(注意
是 3 个 =,也就是严格相等)
既然是严格相等,类型转换什么的基本不考虑了。一个自然的想法就是每次访问 a 返回的值都不一样,那么肯定会想到数据劫持
let cunner = 0
Object.defineProperty(window,'a',{
get(){
cunner++
console.log('我被掉了',cunner,'次');
return cunner
}
})
console.log(a === 1 && a ===2 && a === 3); // true