<script>
//定义对象
let person={
name:'李四',
sex:"男"
}
Object.defineProperty(person,'age',{value:18});//参数:添加属性的对象 添加的属性名 配置项
console.log(person)
</script>
颜色不同:说明了age不可以枚举===age属性不参与遍历
Object.keys(person):对象的所有对象的属性提取出来 作为数组
<script>
//定义对象
let person={
name:'李四',
sex:"男"
}
Object.defineProperty(person,'age',{value:18});//参数:添加属性的对象 添加的属性名 配置项
console.log(Object.keys(person))//传入对象 :对象的所有对象的属性提取出来 作为数据
console.log(person)
发现遍历不到 Object.defineProperty(person,'age',{value:18});//参数:添加属性的对象 添加的属性名 配置项 添加的属性
使用for in
for(let key in person){
console.log(person[key])//遍历数组或者对象
}
那么如何做到可以枚举或者枚举(使用相同的方法,借用配置项) enumerable:true可枚举
enumerable控制属性可枚举 默认false
//定义对象
let person = {
name: '李四',
sex: "男"
}
Object.defineProperty(person, 'age', { value: 18 });//参数:添加属性的对象 添加的属性名 配置项
console.log(Object.keys(person))//传入对象 :对象的所有对象的属性提取出来 作为数据
console.log(person)
for(let key in person){
console.log(person[key])//遍历数组或者对象
}
Object.defineProperty(person, 'dad', { value: "Jhon" ,enumerable:true});//参数:添加属性的对象 添加的属性名 配置项
console.log(person)
直接写:可以更改,但是defineProperty使用这个的属性不可以被更改 需要添加一个属性writable:控制属性是否可以被修改
//定义对象
let person = {
name: '李四',
sex: "男"
}
Object.defineProperty(person, 'age', { value: 18 });//参数:添加属性的对象 添加的属性名 配置项
console.log(Object.keys(person))//传入对象 :对象的所有对象的属性提取出来 作为数据
console.log(person)
for(let key in person){
console.log(person[key])//遍历数组或者对象
}
Object.defineProperty(person, 'dad', { value: "Jhon" ,
enumerable:true,
writable:true});//参数:添加属性的对象 添加的属性名 配置项
console.log(person)
正常写可以被删除 但是defineProperty不可以删除
defineProperty里面的属性configurable: true,控制属性是否可以被删除:默认false
//定义对象
let person = {
name: '李四',
sex: "男"
}
Object.defineProperty(person, 'age', { value: 18 });//参数:添加属性的对象 添加的属性名 配置项
console.log(Object.keys(person))//传入对象 :对象的所有对象的属性提取出来 作为数据
console.log(person)
for (let key in person) {
console.log(person[key])//遍历数组或者对象
}
Object.defineProperty(person, 'dad', {
value: "Jhon",
enumerable: true,
writable: true,
configurable: true,
});//参数:添加属性的对象 添加的属性名 配置项
console.log(person)
defineProperty可以对属性增加限制
此方法不行:需要age属性 和读取number的值
let number=18;
//定义对象
let person = {
name: '李四',
sex: "男",
age:number
}
直接设置遍历值,但是后期更改的时候 不随更改而变化
需要重新执行 person的赋值操作
需要用到一个defineProperty里面的函数get :
let number=18;
//定义对象
let person = {
name: '李四',
sex: "男",
}
Object.defineProperty(person, 'age', {
get:function(){
return number
}
});//参数:添加属性的对象 添加的属性名 配置项
console.log(person)
当有人读取该属性的age属性时,get函数就会被调用,且返回值就是age的值(建立了number和peson.age的关联 重新读取 number)
点击...调用属性getter===get属性+函数
返回值是多少就是多少的值,找getter去询问
重新询问,就会重新调用getter,返回就是ages属性的值
get:function(){
return number
},
简写:一般
get(){
return number
},
get函数建立了number和person的关联,但是没有建立person和number的关联
set函数=setter就会被调用:当有人修改person的age属性时,返回值就是age的值。且回收到修改的值
读取的还是number的值 所以需要变成重新赋值给number
let number = 18;
//定义对象
let person = {
name: '李四',
sex: "男",
}
Object.defineProperty(person, 'age', {
// 当有人读取该属性的age属性时,get函数就会被调用,且返回值就是age的值
get() {
return number
},
//简写
//set函数=setter就会被调用:当有人修改person的age属性时,返回值就是age的值。且回收到修改的值
set(value) {
console.log('有人修改了age属性,value=', value);
number = value;
}
});//参数:添加属性的对象 添加的属性名 配置项
console.log(person)