Object.defineproperty
- 该方法会直接在一个对象上定义 一个 新属性,或者修改一个对象的现有属性,对属性可以有更多控制配置
该方法有 三个 参数 Object.defineProperty(obj, prop, descriptor)
- obj: 要定义属性的对象。
- prop: 要定义或修改的属性的名称或 Symbol 。
descriptor: 要定义或修改的属性描述符。
let value = "这是值", obj = {}
Object.defineProperty(obj, 'key', {
configurable: false,
enumerable: true,
get() {
return value
},
set(newVal) {
value = newValue
}
})
代码演示:
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>第一个Vue</title>
</head>
<body>
<script type="text/javascript">
let number = 2000;
let person = {
name:'张三',
sex:'男'
}
Object.defineProperty(person,'age',{
value:18,
enumerable:true, //控制属性是否可以枚举,默认值是false
writable:true, //控制属性是否可以被修改,默认值是false
configurable:true //控制属性是否可以被删除,默认值是false
})
Object.defineProperty(person,'salary',{
//当有人读取person的age属性时,get函数(getter)就会被调用,且返回值就是age的值
get:function (){
console.log('有人读取了salary属性')
return number;
},
//当有人修改person的age属性时,set函数(setter)就会被调用,且会收到修改的具体值
set(value){
number = value;
}
})
console.log(Object.keys(person))
console.log(person)
</script>
</body>
</html>
通过
Object.defineProperty
此方法添加的属性是不可枚举的也就是不不能被遍历,console.log(Object.keys(person))
这样显示的效果是['name', 'sex']
,添加属性enumerable:true
,控制属性是否能被枚举演示效果:
Object.defineProperties
Object.defineProperties``方法,用于给对象定义属性
方法直接在一个对象上定义 一个或多个 新的属性或修改现有属性
该方法有 两个 Object.defineProperties(obj, props)
- obj: 在其上定义或修改属性的对象。
props: 要定义其可枚举属性或修改的属性描述符的对象
let value = "这是值", obj = {} Object.defineProperties(obj, { username: { value: '小明', configurable: false, writable: true }, password: { value: '***', configurable: true, enumerable: true } })
数据代理
数据代理: 通过一个对象代理对另一个对象中属性的操作(读/写)
代码演示:
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <title>第一个Vue</title> </head> <body> <script type="text/javascript"> let obj = {x:100} let obj2 = {y:200} Object.defineProperty(obj2,'x',{ get(){ return obj.x }, set(value){ obj.x = value } }) </script> </body> </html>
演示效果: