js之Object.defineProperty()

Object.defineProperty() 是 ES5 中的新对象方法。

它允许您定义对象属性和/或更改属性的值和/或元数据。 

Object.defineProperty()

语法:

Object.defineProperty(obj, prop, descriptor)

参数说明:

obj:必需。目标对象
prop:必需。需定义或修改的属性的名字
descriptor:必需。目标属性所拥有的特性

返回值:

传入函数的对象。即第一个参数obj

针对属性,我们可以给这个属性设置一些特性,比如是否只读不可以写;是否可以被for..inObject.keys()遍历。

给对象的属性添加特性描述,目前提供两种形式:数据描述和存取器描述。

实例:

<!DOCTYPE html>
<html>
    <head>
        <meta charset="utf-8">
        <title>js学习</title>
        <script src="jquery-2.0.3.js"></script>
    </head>
    <body>
        <div id="demo"></div>
        <script>
            var person = {
                firstName: "Bill",
                lastName: "Gates",
                language : "NO", 
            }
            //更改属性
            Object.defineProperty(person,"language",{
                value:"EN",
                writable :true,
                enumerable : true,
                configurable : true
            });
            //枚举属性
            var txt = "";
            for(var x in person){
                txt += person[x] + "<br/>"
            }
            document.getElementById("demo").innerHTML = txt;
        </script>
    </body>
</html>

 结果:

writable

属性的值是否可以被重写。设置为true可以被重写;设置为false,不能被重写。默认为false。

enumerable

此属性是否可以被枚举(使用for...in或Object.keys())。设置为true可以被枚举;设置为false,不能被枚举。默认为false。

configurable

是否可以删除目标属性或是否可以再次修改属性的特性(writable, configurable, enumerable)。设置为true可以被删除或可以重新设置特性;设置为false,不能被可以被删除或不可以重新设置特性。默认为false。

这个属性起到两个作用:

  1. 目标属性是否可以使用delete删除
  2. 目标属性是否可以再次设置特性

实例:隐藏了枚举中的语言属性 

<!DOCTYPE html>
<html>
    <head>
        <meta charset="utf-8">
        <title>js学习</title>
        <script src="jquery-2.0.3.js"></script>
    </head>
    <body>
        <div id="demo"></div>
        <script>
            var person = {
                firstName: "Bill",
                lastName: "Gates",
                language : "NO", 
            }
            //更改属性
            Object.defineProperty(person,"language",{
                value:"EN",
                writable :true,
                enumerable : false,//此属性是否可以被枚举(使用for...in或Object.keys())。设置为true可以被枚举;设置为false,不能被枚举。默认为false。
                configurable : true
            });
            //枚举属性
            var txt = "";
            for(var x in person){
                txt += person[x] + "<br/>"
            }
            document.getElementById("demo").innerHTML = txt;
        </script>
    </body>
</html>

结果:

实例:此例创建一个 setter 和 getter 来确保语言的大写更新:

<!DOCTYPE html>
<html>
    <head>
        <meta charset="utf-8">
        <title>js学习</title>
        <script src="jquery-2.0.3.js"></script>
    </head>
    <body>
        <div id="demo"></div>
        <script>
            //创建对象
            var person = {
                firstName: "Bill",
                lastName: "Gates",
                language : "NO", 
            }
            //更改属性
            Object.defineProperty(person,"language",{
                get:function(){
                    return language
                },
                set:function(value){
                   language = value.toUpperCase();
                }
            });
           //更改语言
           person.language = "en";
           //显示语言
           document.getElementById("demo").innerHTML = person.language;
        </script>
    </body>
</html>

结果:

存取器描述

当使用存取器描述属性的特性的时候,允许设置以下特性属性:

var obj = {};
Object.defineProperty(obj,"newKey",{
    get:function (){} | undefined,
    set:function (value){} | undefined
    configurable: true | false
    enumerable: true | false
});

 注意:当使用了getter或setter方法,不允许使用writable和value这两个属性

getter/setter

当设置或获取对象的某个属性的值的时候,可以提供getter/setter方法。

  • getter 是一种获得属性值的方法
  • setter是一种设置属性值的方法。

在特性中使用get/set属性来定义对应的方法

ar obj = {};
var initValue = 'hello';
Object.defineProperty(obj,"newKey",{
    get:function (){
        //当获取值的时候触发的函数
        return initValue;    
    },
    set:function (value){
        //当设置值的时候触发的函数,设置的新值通过参数value拿到
        initValue = value;
    }
});
//获取值
console.log( obj.newKey );  //hello

//设置值
obj.newKey = 'change value';

console.log( obj.newKey ); //change value

注意:get或set不是必须成对出现,任写其一就可以。如果不设置方法,则get和set的默认值为undefined

发布了139 篇原创文章 · 获赞 27 · 访问量 24万+

猜你喜欢

转载自blog.csdn.net/chunchun1230/article/details/104210097