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

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

  • 相关阅读:
    高级软件工程第八次作业LLS战队团队作业五
    Alpha阶段个人总结
    高级软件工程第七次作业:LLS战队Alpha敏捷冲刺7
    高级软件工程第七次作业:LLS战队Alpha敏捷冲刺6
    数独游戏界面功能
    数独棋盘
    调研《构建之法》指导下的全国高校的历届软工实践作品、全国互联网+竞赛、物联网竞赛、华为杯研究生作品赛、全国大学生服务外包赛等各类全国性大学生信息化相关的竞赛平台的历届作品
    高级软件工程课程的实践项目的自我目标
    Beta冲刺汇总博客
    团队作业9——第二次项目冲刺2(Beta阶段)
  • 原文地址:https://www.cnblogs.com/huyuzhu/p/6644046.html
Copyright © 2011-2022 走看看