属性类型

 


2)属性类型

数据属性(重要的话,在本身是true,在方法中默认是false

[[Configurable]] 能否删除从而重新定义,能否修改属性的特性,能否把属性改为访问器属性

[[Enumerable]]能否for-in

[[writable]]能否写

[[Value]]读写

要修改属性的默认特性,可以使用Object.defineProperty(a,b,c)分别是属性所在的对象,属性的名字,一个描叙符对象(上面的四个中的一个或者多个

var person=new Object();
Object.defineProperty(person,"name",{writable:false,value:"fuck"});
alert(person.name);
person.name="you";//writable:false并不能修改
alert(person.name);

访问器属性

[[Configurable]]能否删稠从而重新定义,能否修改属性的特性,能否把属性改为数据属性

[[Enumerable]]for-in

[[Get]]

[[Set]]

访问器属性不能直接定义,只能通过Object.defineProperty(a,b,c)来定义

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

由于实际情况下一次要修改多个属性,所以有方法Object.defineProperties(a,b)分别为要修改的对象,第二个对象是对象的属性和修改的属性合在一起(请注意格式

            var book={};
            Object.defineProperties(book,{//字面量
                _year:{
                    writable: true,//很关键
                    value:2004
                },//逗号
                edition:{
                    writable: true,
                    value:1
                },
                year:{
                    set:function  (a) {
                        if(a>2004){
                            this._year=a;
                            this.edition+=a-2004;
                        }
                    },
                    get:function  () {
                        return this._year;
                    }
                }
            });
            console.log(book.year,book.edition);
            book.year=2007;
            console.log(book);

读取属性特性

Object.getOwnpropertyDescriptor(a,b)属性所在的对象和属性名称

book.year=2007;
            var a=Object.getOwnPropertyDescriptor(book,"_year");
            console.log(a.value,a.configurable,a.writalbe);

 

posted on 2016-08-14 01:05  Kooing  阅读(353)  评论(0编辑  收藏  举报

导航