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

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

  • 相关阅读:
    js如何将字符串作为函数名调用函数
    js如何生成[n,m]的随机数
    UIMenuController,UIPasteboard:复制,粘贴详细解释
    python2.7和 python3.4但是不要
    Android IPC通信和AIDL技术应用
    可穿戴式智能设备,其潜在的安全问题?(上)
    CentOS安装KVM步骤虚拟机,绝对实用!
    Python于*args 和**kwargs使用
    uva 1556
    JSCover+WebDriver/Selenium获得JS 代码覆盖
  • 原文地址:https://www.cnblogs.com/huyuzhu/p/6644046.html
Copyright © 2011-2022 走看看