zoukankan      html  css  js  c++  java
  • 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是一种常用的记号,用于表示只能通过对象方法访问的属性。

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

  • 相关阅读:
    Tomcat,Weblogic,WebSphere,JBoss四种服务器简单对比
    最常用的动态sql语句梳理——分享给使用Mybatis的小伙伴们!
    "Invalid bound statement (not found): com.sitech.admin.dao.TbOpenAbilityInfoDao.findAbilityReadyUp"mybatis配置文件bug
    "Cannot convert value '0000-00-00' from column 2 to TIMESTAMP"mysql时间转换bug
    你一定要知道的关于Linux文件目录操作的12个常用命令
    超实用,你get了吗?再也不怕本地文件更新到环境用Linux命令重启服务器了。。。
    最长连续公共子串、最长公共子串(可以非连续)、最长回文串(连续)、最长回文串(可以不连续)、最长递增数组的求解
    显示锁(ReentranLock)
    对象的共享
    线程安全性
  • 原文地址:https://www.cnblogs.com/huyuzhu/p/6644046.html
Copyright © 2011-2022 走看看