目录
1.Object.defineProperty()的使用
object. defineProperty(对象名,"属性名",参数);实现的双向数据绑定,该方法是es5提供的新功能,不支持ie8及以下版本。
该方法允许精确地添加或修改对象的属性。
通过对象赋值操作添加的普通属性是可枚举的,可以改变这些属性的值,也可以删除(如:delete)这些属性。
这个方法允许修改默认的额外选项(或配置)。默认情况下,使用 Object.defineProperty() 添加的属性值是不可修改(immutable)的。
对象里目前存在的属性描述符有两种主要形式:数据描述符和存取描述符。数据描述符是一个具有值的属性,该值可以是可写的,也可以是不可写的。存取描述符是由 getter 函数和 setter 函数所描述的属性。一个描述符只能是这两者其中之一;不能同时是两者。
var student = {}
var sex = "男"
Object.defineProperties(student,{
name:{
value:"张三",
writable:false
},
age : {
value : 16,
writable:true
},
sex:{
get(){
return sex
},
set(v){
sex = v
}
}
})
修饰符
value: 设置属性的值
writable: 值是否可以重写。true | false
enumerable: 目标属性是否可以被枚举。true | false
configurable: 目标属性是否可以被删除或是否可以再次修改特性 true | false
set: 目标属性设置值的方法
get:目标属性获取值的方法
2.举个例子
如:
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>defineProperty的使用</title>
</head>
<body>
<div id="name"></div>
<script>
var person={
name:'张三'
};
Object.defineProperty(person,'name',{
configurable:true,//可删除
enumerable:true,//可枚举
//writable:true,//可写入,加了set方法实际上就是,所以注掉有冲突
get(){
console.log("调用了get方法");
return document.getElementById('name').innerHTML
},
set(val){
console.log("调用了set方法");
document.getElementById('name').innerText=val;
}
})
</script>
</body>
</html>
如图,我们把person对象的name属性进行了一些修改,增加了get set方法
3.运行
当你这样操作的时候,其实会帮你调用name的get方法,至于为什么是空值,是因为我们把name属性进行了修改,你可以指定value来赋新值
当你这样操作的时候,调用了set方法修改了person.name的值,同时页面显示了张三。