美文网首页
【面向对象的程序设计(1)】属性

【面向对象的程序设计(1)】属性

作者: Wonder233 | 来源:发表于2017-11-17 11:42 被阅读0次

    属性类型

    数据属性

    数据属性包含一个数据值的位置。在这个位置可以读取和写入值。

    共有4个描述其行为的特性。

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

    修改属性默认的特性,使用ECMAScript 5中的Object.defineProperty()方法。

    /* Object.defineProperty()
     * param:
     *       param1——属性所在的对象
     *       param2——属性的名字
     *       param3——一个描述符对象(描述符对象的属性必须是:
     *               Configurable、Enumerabel、Writable、Value)
     */
     var person = {};
     Object.defineProperty(person,"name",{
         writable:false,
         value:"Nicholas"
     });
     console.log(person.name);  //Nicholas
     person.name = "Greg";
     console.log(person.name);  //Nicholas
    

    调用Object.defineProperty()方法创建一个新的属性时,如果不指定,Configurable、Enumerabel、Writable特性的默认值都是false,如果调用Object.defineProperty()只是修改已定义的属性的特性,则无此限制。

    访问器属性

    包含一对getter和setter函数(都不是必须的)。
    在读取访问器属性时,会调用getter函数,返回有效的值;在写入访问器属性时,会调用setter函数,传入新值。

    访问器属性有如下4个特性:

    • [[Configurable]]:表示能否通过delete删除属性从而重新定义属性,能否修改属性的特性,或者能否把属性修改为数据属性。对于直接在对象上定义的属性,默认为true。
    • [[Enumerabel]]:表示能否通过for-in循环返回属性。对于直接在对象上定义的属性,默认为true。
    • [[Get]]:在读取属性时调用的函数。默认为undefined。
    • [[Set]]:在写入属性时调用的函数。默认为undefined。

    访问器属性不能直接定义,必须使用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;
    console.log(book.edition); //2
    

    只有getter意味着属性不能写,尝试写入属性会被忽略,严格模式下,尝试写入只有getter函数的属性会抛出错误。
    只有setter意味着属性不能度,尝试读会返回undefined,严格模式下会抛出错误。

    定义多个属性

    /* Object.defineProperties()
     * 可以通过描述符一次定义多个属性。
     * param:接收两个对象参数
     *      param1——要添加和修改其属性的对象
     *      param2——其属性与第一个对象中要添加或修改的属性一一对应
     */
     
    var book = { };
    Object.defineProperties(book,{
       _year:{
           writable:true,
           value:2004
       },
       edition:{
           writable:true,
           value:1
       },
       year:{
           get:function(){
               return this._year;
           },
           set:function(newValue){
               if (newValue > 2004) {
                   this._year = newValue;
                   this.edition += newValue - 2004;
               }
           }
       }
    
    

    读取属性的特性

    /* Object.getOwnPropertyDescriptor()
     * 取得给定属性的描述符。
     * param:
     *       param1——属性所在的对象
     *       param2——要读取其描述符的属性名称
     * return:返回值是一个对象
     *       如果是访问器属性,则此对象的属性有configurable、enumerable、
     *       get和set;
     *       如果是数据属性,则此对象的属性有configurable、enumerable、
     *       writable和value。
     */
    
    var book = {};
    Object.defineProperties(book, {
        _year: {
            writable: true,
            value: 2004
        },
        edition: {
            writable: true,
            value: 1
        },
        year: {
            get: function () {
                return this._year;
            },
            set: function (newValue) {
                if (newValue > 2004) {
                    this._year = newValue;
                    this.edition += newValue - 2004;
                }
            }
        }
    });
    var descriptor = Object.getOwnPropertyDescriptor(book,"_year");
    console.log(descriptor.value);           //2004
    console.log(descriptor.configurable);    //false
    console.log(typeof  descriptor.get);     //undefined
    
    var decriptor = Object.getOwnPropertyDescriptor(book,"year");
    console.log(decriptor.value);            //undefined
    console.log(decriptor.enumerable);       //false
    console.log(typeof  decriptor.get);      //function
    
    

    相关文章

      网友评论

          本文标题:【面向对象的程序设计(1)】属性

          本文链接:https://www.haomeiwen.com/subject/ktzdvxtx.html