理解对象

对象是特定引用类型的实例,ECMA-262定义:无序属性的集合,其属性可以包含基本值、对象或函数。

创建自定义对象最简单的方式就是创建一个Object的实例,然后再为它添加属性和方法。

var person = new Object();
person.name = "siyuan";
person.sayName = function(){
    alert(this.name);
}

属性的特征是内部值,规范将它放在两对方括号中。

1. 数据属性,数据属性包含一个数据值的位置,在这个位置可以读取或写入值。
  • [[Configurable]] 能否通过delete删除属性从而重新定义属性,能否修改属性的特性,能否把属性修改为访问器属性。
  • [Enumberable]] 能否通过for-in 循环属性。
  • [[Writeable]] 能否修改属性的特性。
  • [[Value]] 包含这个属性的数据值。
2.访问器属性,访问器属性不包含数据值,包含一对getter和setter函数.

在读取访问器属性时,会调用getter函数,负责返回有效的值,在写入访问器属性时,会调用setter并传入新值。

  • [[Configurable]]
  • [Enumberable]]
  • [[getter]] 在读取属性时调用的函数,默认值为undefined
  • [[setter]] 在写入属性时调用的函数,默认值为undefined
Object.defineProperty(对象, 属性名, 描述符对象)

修改属性默认的特性,这个方法接收三个参数,属性所在的对象,属性的名字和一个描述符对象。其中,描述符对象的属性必须是:configurable/enumberable/writeable/value

var person = {};
Object.defineProperty(person, "name", {
    writeable: false,
    value: "siyuan"
})
alert(person.name);   //"siyuan"
person.name = "duoduo";
alert(person.name); // "siyuan"

使用访问器属性的常见方式,设置一个属性的值会导致其他属性发生变化。

var book = {
    _year: 2001,  //_year前面的下划线是一种常用的记号,用于表示只能通过对象方法访问的属性。
    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;
alert(book.edition); //2
//访问器属性year包含一个getter和setter函数,getter函数返回_year的值,setter函数通过计算来确定正确的版本。
Object.defineProperties(对象, 属性)

通过描述符一次定义多个属性,这个方法接收两个对象参数,第一个对象是要添加和修改其属性的对象,第二个对象的属性与第一个对象中要添加或修改的属性一一对应。

Object.getOwnPropertyDescriptor(对象, 属性名)

取得给定属性的描述符,返回值为一个对象。

你可能感兴趣的:(理解对象)