语法
Object.defineProperty(obj, prop, descriptor)
参数说明:
obj:必需。目标对象
prop:必需。需定义或修改的属性的名字
descriptor:必需。目标属性所拥有的特性
返回值:
传入函数的对象。即第一个参数obj。
针对属性,我们可以给这个属性设置一些特性,比如是否只读不可以写;是否可以被for..in或Object.keys()遍历。
示例1:
<!DOCTYPE html>
<html lang="zh">
<head>
<meta charset="UTF-8" />
<meta name="viewport" content="width=device-width, initial-scale=1.0" />
<meta http-equiv="X-UA-Compatible" content="ie=edge" />
<title>Object.defineProperty 示例</title>
</head>
<body>
<script type="text/javascript">
var ss = {
age: 10
};
var name = 'mfg';
Object.defineProperty(ss, 'name', {
//设置是否可以枚举
enumerable: false,
//是否可以删除目标属性
configurable: false,
// writable 控制是否可以修改(赋值)
//获取属性值
get() {
return name;
},
//设置属性值
set(val) {
name = val;
}
})
console.log(ss.name)
ss.name = 'new value';
console.log(ss.name);
</script>
</body>
</html>
示例2:
<!DOCTYPE html>
<html lang="zh">
<head>
<meta charset="UTF-8" />
<meta name="viewport" content="width=device-width, initial-scale=1.0" />
<meta http-equiv="X-UA-Compatible" content="ie=edge" />
<title>Object.defineProperty 示例</title>
</head>
<body>
<script type="text/javascript">
Object.defineProperties(Object.prototype, 'allkeys', {
value: function() {
let result = [];
for(let i in this) {
result.push(i)
}
return result;
},
writable: true,
//关键配置,不可枚举,这样就可以在for in中遍历不到了
enumerable: false,
configurable: true
});
</script>
</body>
</html>
说明:
示例2的例子,在Object.prototype上增加了方法,同时保证了不被for in遍历到。