• ECMAScript中的两种属性


    数据属性

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

    数据属性有4个描述其行为的特征。

    • configurable:true/false,是否可以通过delete删除属性,能否修改属性的特性,能否把属性修改为访问器属性,默认false;

    • enumerable:true/false,是否可以通过for in循环返回,默认false;

    • writable:true/false,是否可以修改属性的值,默认false;

    • value:undefined,设置属性的值,默认undefined。

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

    var person = {};
    Object.defineProperty(person,"name",{
    	writable:false,
    	value:"hh"
    });
    console.log(person.name);//hh
    person.name = "dd";
    console.log(person.name);//hh
    

    因为writable属性是只读的,所以不可以修改。在非严格模式下操作会被忽略,严格模式下会报错。

    类似的规则也适合于不可配置的属性

    var person = {};
    Object.defineProperty(person,"name",{
    	configurable:false,
    	value:"hh"
    });
    console.log(person.name);//hh
    delete person.name;
    console.log(person.name);//hh
    

    一旦把属性设置为不可配置,就不可以把它变回可配置了,此时再调用Object.defineProperty()方法修改除writable之外的特性,都会导致错误:

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

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

    访问器属性

    访问器属性不包括数值,它们包含一对getter和setter函数(但这两个函数都不是必须的),在读取访问器属性的时候,会调用getter函数,这个函数负责返回有效的值,在写入访问器属性的时候,会调用setter函数并传入新值,这个函数决定如何处理数据。

    访问其属性有4个描述其行为的特征。

    • configurable:true/false,是否可以通过delete删除属性,能否修改属性的特性,能否把属性修改为访问器属性,默认false;

    • enumerable:true/false,是否可以通过for in循环返回,默认false;

    • set:function,读取属性值时调用的函数;

    • get:function,修改属性值时调用的函数。

    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,edition0);//2
    

    —_year是一种常用的记号,用于表示只能通过对象方法访问的属性。

    这个例子是用访问器属性的常见方法,即设置一个属性的值会导致其他属性发生变化。

  • 相关阅读:
    P1128 [HNOI2001]求正整数
    zabbix-server端监控MySQL服务
    对服务器磁盘、CPU、内存使用状态,设置163邮件告警
    JDK8 的FullGC 之 metaspace
    JDK8-废弃永久代(PermGen)迎来元空间(Metaspace)
    JVM的方法区和永久带是什么关系?
    如何使用start with connect by prior递归用法
    JVM原理讲解和调优
    jvm 性能调优工具之 jstat
    记一次HBase内存泄漏导致RegionServer挂掉问题
  • 原文地址:https://www.cnblogs.com/huyuzhu/p/6644046.html
Copyright © 2020-2023  润新知