JS之Object.defineProperty()方法

1.数据属性
这里写图片描述
修改属性默认的属性,必须使用ECMAScript的Object.defineProperty()方法。这个方法接收三个参数:属性所在的对象、属性的名字和一个描述性对象。其中,描述符对象的属性必须是:configurable、enumerable、writabel、和value。设置其中的一或多个值,可以修改对应的特性值。

var person = {};
Object.defineProperty(person,"name",{
    writable:false,
    value:"zhangsan"
});
alert(person.name);//zhangsan
person.name = "lisi";
alert(person.name);//zhangsan

这个例子创建了一个名为name的属性,它的值“name”是只读的。这个属性的值是不可修改的,如果尝试为它指定新值,则在非严格模式下,赋值操作将被忽略;在严格模式下,赋值操作将会导致抛出错误。类似的规则也适用于不可配置的属性,如:
把configurable设置为false,表示不能从对象中删除属性

var person = {};
Object.defineProperty(person,"name",{
     configurable:false,
     value:"zhangsan"
 });
 alert(person.name);//zhangsan
 delete person.name;
 alert(person.name);//zhangsan

2.访问器属性

访问器属性不能直接定义,必须使用Object.defineProperty()来定义

var book = {
    _year:2004,
    edition:1
};
Object.defineProperty(book,"year",{
   get:function(){
       return this._year;
   },
   set:function(newValue){
       if(newValue > 2004){
           this._year = newValue;
           this.edition += newValue-2004;
       }
   }
});
book.year = 2005;
alert(book.edition);//2

这里写图片描述
这里写图片描述

定义多个属性

var book = {};
Object.defineProperties(book,{
    _year:{
        value:2004
    },
    edition:{
        value:1
    },
    year:{
        get:function() {
            return this._year;
        },

    set:function(newValue) {
        if (newValue > 2004) {
            this._year = newValue;
            this.edition += newValue - 2004;
        }
    }
 }
});
book.year = 2005;
alert(book.edition);//2

以上代码在book对外上定义了两个数据属性(_year和edtion)和一个访问器属性(year),最终的对象与上面定义的对象相同。唯一的区别就是这里的属性都是在同一时间创建的

参考:《JavaScript高级程序设计(第3版)》

猜你喜欢

转载自blog.csdn.net/lxjstudyIT/article/details/80368408
今日推荐