文章目录
  1. 1. 理解对象
    1. 1.1. 属性类型
      1. 1.1.1. 数据属性
      2. 1.1.2. 访问器属性

理解对象

ECMAScript 中没有类的概念。
ECMA-262 把对象定义为:“无序属性的集合,其属性可以包含基本值、对象或者函数。”
我们可以把 ECMAScript 的对象想象成散列表:无非就是一组名值对,其中值可以是数据或函数。

创建对象的方法。

早期,最简单的方式就是:先创建一个 Object 实例,再给它添加属性和方法。如下:

1
2
3
4
5
6
var person = new Object();
person.name = "anjia";
person.sayName = function(){
alert(this.name);
};

后来,用对象字面量创建。如下:

1
2
3
4
5
6
var person = {
name: "anjia",
sayName: function(){
alert(this.name);
}
};

无论哪种方式,所创建的对象 person 都有相同的属性和方法。
这些属性在创建的时候,就带有一些特征值,js 就通过这些特征值来定义它们的行为。

属性类型

ECMA-262 定义这些属性特性是为了实现 Javascript 引擎用的,所以在 Javascript 中不能直接访问它们。为了表示特性是内部值,该规范就把它们放在了两对方括号中,eg. [[Enumerable]]。

ECMAScript 中有两种属性:数据属性和访问器属性。

数据属性

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

  • [[Configurable]]:能否被 delete 删除,能否修改其特性。默认 true
  • [[Enumerable]]:能否通过 for-in 循环取。默认 true
  • [[Writable]]:能否修改属性的值。默认 true
  • [[Value]]:存着属性本身的值。默认 undifined

要修改属性默认的特性,必须使用 ECMAScript 5 的 Object.defineProperty() 方法。但具体实现上,不同浏览器版本中又会有差异。到用到时再细查。

多数情况下,我们都用不到要修改这些特性,但理解这些概念有助于理解 Javascript 对象。

访问器属性

访问器属性不包含数据值。它们包含一对 getter 和 setter 函数(当然,都不是必需的)。

访问器属性有如下4个特性。

  • [[Configurable]]:能否被 delete 删除,能否修改属性的特性。默认 true
  • [[Enumerable]]:能否通过 for-in 循环读取。默认 true
  • [[Get]]:读取属性时调用的函数。默认 undifined
  • [[Set]]:写入属性时调用的函数。默认 undifined

访问器属性不能直接定义,必须使用 Object.defineProperty() 来定义。

文章目录
  1. 1. 理解对象
    1. 1.1. 属性类型
      1. 1.1.1. 数据属性
      2. 1.1.2. 访问器属性