javascript对象属性的特性

       js对象属性除了包含名字和值之外,也包含一些描述它们可写,可枚举,可配置的特性,ECMAScript5提供了一些API方便我们去配置和修改这些属性特性;

        js对象属性主要有两种,一种是存储存器属性,一种是数据属性;存储器属性的四个特性分别是读取(get),写入(set),枚举(enumerable),配置(configurable);数据属性不具备读取(get)和写入(set)特性,它的特性分别是值(value),可写性(writable),可枚举性(enumerable),可配置性(configurable);

        那到底什么是存储器属性,什么是数据属性?(知道的可以直接略过)

        在ECMAScript5中,属性值可以用一个或两个方法替代,这两个方法就是getter和setter。由getter和setter定义的属性称为”存储器属性“,它不同于”数据属性“,数据属性只有一个简单的值,如下:

javascript对象属性的特性

        存储器属性定义为一个或两个和属性同名的函数,只不过这里的函数定义没有使用function关键字,而是使用get和(或)set,如果属性同时具有getter和setter方法,那么它就是一个可读/可写属性,如果它只有getter方法,那么它就是一个只读属性,如果它只有setter方法,那么它就是一个只写属性,读取只写属性总是返回undefined;通过调用Object.getOwnPropertyDescriptor()可以获得某个对象特定属性的属性描述符:

javascript对象属性的特性

javascript对象属性的特性

javascript对象属性的特性

对于继承属性和不存在的属性,返回undefined。

        从函数名就可以看出,Object.getOwnPropertyDescriptor()只能得到自有属性的描述符。要想获得继承属性的特性,需要遍历原型链(在ECMAScript5中可用Object.getPrototypeOf()查看原型属性)。

        要想设置属性的特性,或者让新建属性具有某个特性,可以使用Object.defineProperty(),传入要修改的对象、要创建或修改的属性、要设置的属性描述符对象:

javascript对象属性的特性

        传入Object.defineProperty()的属性描述符对象不必包含所有4个属性,即使不想修改属性的属性特性,也要传一个空的属性描述符对象,即Object.defineProperty(o,"x",{})不然会抛出类型错误,对于新创建的属性,默认的特性值为false或undefined。注意,这个方法要么修改已有属性要么新建自有属性,不能修改继承属性。

        如果要同时修改或新增多个自有属性,可以使用Object.defineProperties(),第一个参数是要修改的对象,第二个参数是一个映射表,它包含要新建或修改的属性名称,和它们对应的属性描述符对象

javascript对象属性的特性


定义属性特性时需要注意到以下几个问题:

1、如果对象是不可扩展的,则只可以编辑已有的自有属性,不能为其新增属性;

2、如果属性是不可配置的,则不能修改它的可配置性和可枚举性;

3、如果存储器属性是不可配置的,则不能修改其getter和setter方法,也不能把它转换为数据属性;

4、如果数据属性是不可配置的,则不能将其转换为存储器属性,也不能将其可写性从false改写为true,但可以从true改写为false;

5、如果数据属性是不可配置也不可写,则不能修改它的值。然而可配置但不可写的值是可以修改的(实际上是将其先配置为可写的,然后再修改它的值,最后转换为不可写的)

第一次写博客,做总结,此处推荐一本javascript书(javascript权威指南),上面大多数知识点该书都有涉及,可以了解一下

完毕