|
首先看一下官方的定义:
Object.defineProperty() 方法会直接在一个对象上定义一个新属性,或者修改一个已经存在的属性, 并返回这个对象。语法 Object.defineProperty(obj,prop,descriptor) 参数
Configurable: 总开关,一旦为false,就不能再设置他的(value,writable,configurable),表示能否通过delete删除属性从而重新定义属性,能否修改属性的特性,或者能否把属性修改为访问器属性。像前面例子中那样直接在对象上定义的属性,它们的这个特性默认值为:true。 Value :属性的值,默认为 undefined。 writable: 该属性是否可写,如果设置成 false,则任何对该属性改写的操作都无效(但不会报错,但是在严格模式下会报错。),对于像前面例子中直接在对象上定义的属性,这个属性该特性默认值为为 true。 enumerable:定义了对象的属性是否可以在 for…in 循环和 Object.keys() 中被枚举。 get: 对定义的属性取值的时候会触发get 对应的函数,并且返回结果,默认返回undefined。 set:对定义的属性赋值的时候会触发set 对应的函数 关于Configurable在上文中讲到总开关的事,在此我想结合《javascript高级程序设计》中的例子来测试一下: <!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title></title>
</head>
<body>
<script type="text/javascript">
//定义一个空的对象
var person={};
//结合Object.defineProperty方法来定义属性名,以及给值
Object.defineProperty(person,"name",{
value:"Nicholas",
configurable:false
});
document.write(person.name);
person.name="xiaohong";
document.write("");
document.write(person.name);
</script>
</body>
</html>输出:
Nicholas Nicholas 看样是没错的,即使重新给属性name赋值,它还是输出同样的结果,结果没变。下面我们再看看给出writable的结果,这次上述代码基本没变,只是给出了一个writable. <!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title></title>
</head>
<body>
<script type="text/javascript">
//定义一个空的对象
var person={};
//结合Object.defineProperty方法来定义属性名,以及给值
Object.defineProperty(person,"name",{
value:"Nicholas",
configurable:false,
writable:true
});
document.write(person.name);
person.name="xiaohong";
document.write("");
document.write(person.name);
</script>
</body>
</html>输出:
Nicholas xiaohong 其结果发生了改变,可见writable的级别要高于configurable,属性的值是否可读可写最关键取决于writable. 参考:https://blog.csdn.net/tashanhongye/article/details/74015729 扩展:https://developer.mozilla.org/zh-CN/docs/Web/JavaScript/Reference/Global_Objects/Object/defineProperty |
|
|