1.(在f12控制台的字体颜色区别)
1.1未使用defineproperty添加属性
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta http-equiv="X-UA-Compatible" content="IE=edge">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>回顾Object.defineproperty方法</title>
</head>
<body>
<script type="text/javascript">
let person = {
name:'张三',
sex:'男',
age:18
}
console.log(person);
</script>
</body>
</html>
1.2 使用defineproperty添加属性
总结: 会发现,通过Object.defineproperty添加进来的属性颜色会浅些
2.是否可枚举
2.1未使用defineproperty添加属性
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta http-equiv="X-UA-Compatible" content="IE=edge">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>回顾Object.defineproperty方法</title>
</head>
<body>
<script type="text/javascript">
let person = {
name:'张三',
sex:'男',
age:18
}
// Object.defineProperty(person,'age',{
// value:18
// })
console.log(Object.keys(person));
</script>
</body>
</html>
2.2 使用defineproperty添加属性
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta http-equiv="X-UA-Compatible" content="IE=edge">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>回顾Object.defineproperty方法</title>
</head>
<body>
<script type="text/javascript">
let person = {
name:'张三',
sex:'男'
// age:18
}
Object.defineProperty(person,'age',{
value:18
})
console.log(Object.keys(person));
</script>
</body>
</html>
总结: Object.defineproperty不可枚举,就是不可以遍历得到通过Object.defineproperty添加进来的属性
3.使用enumerable
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta http-equiv="X-UA-Compatible" content="IE=edge">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>回顾Object.defineproperty方法</title>
</head>
<body>
<script type="text/javascript">
let person = {
name:'张三',
sex:'男'
// age:18
}
Object.defineProperty(person,'age',{
value:18,
enumerable:true, //控制属性是否可以枚举,默认值是false
})
console.log(Object.keys(person));
console.log(person)
</script>
</body>
</html>
总结: 会发现添加了enumerable属性后,不仅可以枚举了,颜色也变深了。
但是会发现一个问题,就是无法修改
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta http-equiv="X-UA-Compatible" content="IE=edge">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>回顾Object.defineproperty方法</title>
</head>
<body>
<script type="text/javascript">
let person = {
name:'张三',
sex:'男'
// age:18
}
Object.defineProperty(person,'age',{
value:18,
enumerable:true, //控制属性是否可以枚举,默认值是false
})
console.log(Object.keys(person));
console.log(person)
person.age = 19;
console.log(person)
</script>
</body>
</html>
不是用Object.defineproperty的是可以修改的
4.使用writable
5.使用configurable
正常情况下,是可以任意删除属性的
使用Object.defineproperty的
添加configurable属性的
6.使用get函数
有个场景:如下代码,我想在控制台上让其number修改后,person.age也跟着改变
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta http-equiv="X-UA-Compatible" content="IE=edge">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>回顾Object.defineproperty方法</title>
</head>
<body>
<script type="text/javascript">
let number = 18;
let person = {
name:'张三',
sex:'男',
age:number
}
// Object.defineProperty(person,'age',{
// value:18,
// enumerable:true, //控制属性是否可以枚举,默认值是false
// writable:true, //控制属性是否可以被修改,默认值是false
// configurable:true //控制属性是否可以被删除,默认值是false
// })
console.log(person);
</script>
</body>
</html>
解决方案:使用Object.defineproperty里的get函数
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta http-equiv="X-UA-Compatible" content="IE=edge">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>回顾Object.defineproperty方法</title>
</head>
<body>
<script type="text/javascript">
let number = 18;
let person = {
name:'张三',
sex:'男',
// age:number
}
Object.defineProperty(person,'age',{
// value:18,
// enumerable:true, //控制属性是否可以枚举,默认值是false
// writable:true, //控制属性是否可以被修改,默认值是false
// configurable:true //控制属性是否可以被删除,默认值是false
// 当有人读取person的age属性时,get函数就会被调用,且返回值就是age的值
get:function(){
return number;
}
})
console.log(person);
</script>
</body>
</html>
会发现有个 get age:f() 刚好对应get函数对应的age属性
7.使用set函数
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta http-equiv="X-UA-Compatible" content="IE=edge">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>回顾Object.defineproperty方法</title>
</head>
<body>
<script type="text/javascript">
let number = 18;
let person = {
name:'张三',
sex:'男',
// age:number
}
Object.defineProperty(person,'age',{
// value:18,
// enumerable:true, //控制属性是否可以枚举,默认值是false
// writable:true, //控制属性是否可以被修改,默认值是false
// configurable:true //控制属性是否可以被删除,默认值是false
// 当有人读取person的age属性时,get函数(getter)就会被调用,且返回值就是age的值
get:function(){
return number;
},
// 当有人修改person的age属性时,set函数(setter)就会被调用,且会受到修改的具体指
set(value){
console.log('有人修改了age属性,且值是',value);
}
})
console.log(person);
</script>
</body>
</html>
会发现person的age并没有发生变化,因为get函数会返回age的值,而get函数return的是number这个变量,如果需要修改,则在set函数中添加number=value;