doubleyong
管理员
管理员
  • 最后登录2026-05-10
  • 发帖数1198
  • 最爱沙发
  • 喜欢达人
  • 原创写手
  • 社区居民
  • 忠实会员
阅读:5983回复:0

[js]javascript中神奇的Object.defineProperty()

楼主#
更多 发布于:2018-09-05 16:21
首先看一下官方的定义:
Object.defineProperty()
方法会直接在一个对象上定义一个新属性,或者修改一个已经存在的属性, 并返回这个对象。语法

Object.defineProperty(obj,prop,descriptor)
参数
  • obj
  • 需要定义属性的对象。
  • prop
  • 需定义或修改的属性的名字。
  • descriptor
  • 将被定义或修改的属性的描述符。
参数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
知识需要管理,知识需要分享
游客


返回顶部

公众号

公众号