zoukankan      html  css  js  c++  java
  • 6.1.1.1 属性类型之数据属性

      ECMAScript中有两种属性:数据属性和访问器属性。

      数据属性

      数据属性包含一个数据值的位置。在这个位置可以读取和写入值。数据属性有4个描述其行为的特性。

    • [[Configurable]]:表示能否通过delete删除属性从而重新定义属性,能否修改属性的特性,或者能否把属性修改为访问器属性。像前面例子中那样直接在对象上定义的属性,它们的这个特性默认值为true。
    • [[Enumerable]]:表示能否通过for-in循环返回属性。像前面例子中那样直接在对象上定义的属性,它们的这个特性默认值为true。
    • [[Writable]]:表示能否修改属性的值。想前面例子中那样直接在对象上定义的属性,它们的这个特性的默认值为true。
    • [[Value]]:包含这个属性的数据值。读取属性值的时候,从这个位置读;写入属性值的时候,把新值保存在这个位置。这个特性的默认值为undefined。

      对于前面例子中那样直接在对象上定义的属性,它们的[[Configurable]]、[[Enumerable]]和[[Writable]]特性都被设置为true,而[[Value]]特性被设置为指定的值。例如:

    var person = {
        name:"Tom"
    }
    

      这里创建了一个名为name的属性,为它指定的只是“Tom”。也就是说,[[Value]]特性将被设置为“Tom”,而对这个值得任何修改都将反映在这个位置。

      要修改属性默认的特性,必须使用ECMAScript5的Object.defineProperty()方法。这个方法接收三个参数:属性所在的队形、属性的名字和一个描述符队形。其中,描述符(descriptor)对象的属性必须是:configurable、enumerable、writable和value。设置其中的一个或多个值,可以修改对应的特性值。例如:

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

      这个例子穿件了一个名为name的属性,它的值“Tom”是只读的。这个属性的值是不可修改的,如果尝试为它指定新的值,则在非严格模式下,赋值操作将被忽略;在严格模式下,赋值操作将会导致抛出错误。

      类似的规则也适用于不可配置的属性。例如:

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

      把configurable设置为false,表示不能从对象中删除属性。如果对这个属性调用delete,则在非严格模式下什么也不会发生,而在严格模式下会导致错误。而且,一旦把属性定义为不了配置的,就不能再把它变回可配置了。此时,再调用Object.defineProperty()方法修改除writable之外的特性,都会导致错误:

    var person = {};
    Object.defineProperty(person,"name",{
        configurable:false,
        value:"Tom"
    });
    
    //抛出错误
    Object.defineProperty(person,"name",{
        configurable:true,
        value:"Tom"
    });
    

      也就是说,可以多次调用Object.defineProperty()方法修改同一个属性,但在把configurable特性设置为false之后就会有限制了。

      在调用Object.defineProperty()方法时,如果不指定,configurable、enumerable和writable特性的默认值都是false。多数情况下,可能都没有必要利用Object.defineProperty()方法提供的这些高级功能。不过,理解这些概念对理解JavaScript对象却非常有用。

      注:IE8是第一个实现Object.defineProperty()方法的浏览器版本。然而,这个版本的实现存在诸多限制:只能在DOM对象上使用这个方法,而且只能创建访问器属性。由于实现不彻底,建议读者不要再IE8中使用Object.defineProperty()方法。

  • 相关阅读:
    WPF e.Systemkey的一个坑
    Codeforces Round #375 (Div. 2) ABCDE
    主席树模板(poj2104)
    hdu5909-Tree Cutting(树形dp)
    HYSBZ 2243-染色 (树链剖分)
    POJ3237-Tree (树链剖分,线段树区间更新+点更新+区间查询)
    POJ2763-Housewife Wind(树链剖分)
    2016东北四省赛 小结
    HDU3966-Aragorn's Story(树链剖分)
    POJ 2749--Building roads(2-SAT)
  • 原文地址:https://www.cnblogs.com/yxlove/p/4557314.html
Copyright © 2011-2022 走看看