• 高程第六章--面向对象程序设计--属性类型


    ES有两种属性类型:数据属性和访问器属性。

    一、数据属性4个描述其行为的特性。

    1:[[Configurable]]:表示能否通过delete删除属性从而重新定义属性。

    2: [[Enumerable]]:表示能否通过for-in循环返回属性

    3: [[Writable]]:表示能否修改属性的值

    4:[[Value]]:包含这个属性的属性值

    要修改属性默认的特性,必须使用ES5的defineProperty()方法

    //"use strict";
    var person = {};
    Object.defineProperty(person,'name',{
        writable:false,//表示能否修改属性的值为true的话可以修改  默认false
        value:"Nicholas"
    });
    console.log(person.name);//Nicholas
    person.name = "Grey";//严格模式下会报错
    console.log(person.name);//Nicholas true的情况下"Grey"
    // "use strict";
    var person = {};
    Object.defineProperty(person,'name',{
        configurable:true,//表示不能删除对象中的属性  默认为true
        value:"Nicholas"
    });
    console.log(person.name);//Nicholas
    delete person.name;//严格模式下会报错
    console.log(person.name);//Nicholas

    //"use strict";
    var person = {};
    Object.defineProperty(person,'name',{
        configurable:false,//表示不能删除对象中的属性
        value:"Nicholas"
    });
    //抛出错误
    Object.defineProperty(person,'name',{
        configurable:true,//一旦把属性定义为不可配置,就不能再把他变回可配置
        value:"Nicholas"
    });
    
    
    
     

    二:访问器属性 不包含数据值,他们包含一对getter和setter函数 但是不是必须的

    1:[[Configurable]]:表示能否通过delete删除属性从而重新定义属性。

    2: [[Enumerable]]:表示能否通过for-in循环返回属性

    3: [[Get]]:在读取属性时调用的函数。默认为undefined。

    4: [[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

    _year前面的下划线是一种常用的记号,用于表示对象方法访问的属性。而访问器属性year则包含一个getter和setter的函数。getter函数返回_year的值。而setter函数通过计算来确定正确的版本。

    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
                    }
                }
            }
        }
    )
    var descriptor = Object.getOwnPropertyDescriptor(book,"_year");//数据属性
    console.log(descriptor.value);//2004
    console.log(descriptor.configurable);//false
    console.log(descriptor.get);//underfined
    
    var descriptor = Object.getOwnPropertyDescriptor(book,"year");//访问器属性
    console.log(descriptor.value);//underfined
    console.log(descriptor.enumerable);//false
    console.log(descriptor.get);//[Function: get]
  • 相关阅读:
    gdb 调试(查看运行时数据)(五)
    Kendo UI开发教程(23): 单页面应用(一)概述
    Kendo UI开发教程(24): 单页面应用(二) Router 类
    Kendo UI开发教程(26): 单页面应用(四) Layout
    Kendo UI开发教程(25): 单页面应用(三) View
    Kendo UI开发教程(27): 移动应用开发简介
    [置顶] Kendo UI开发教程: Kendo UI 示例及总结
    web端、android端的文件上传
    [置顶] 关于本博客 http://www.imobilebbs.com
    hdu4707 Pet
  • 原文地址:https://www.cnblogs.com/mr-pz/p/5906930.html
Copyright © 2020-2023  润新知