JavaScript-对象

前言

  • 对象是JS的基本数据类型;
  • 对象也可看做是属性的无序集合,每个属性都是一个名/值对;
  • 也可以把对象看成是字符串到值的映射;
  • 对象除了可以自有的属性,还可以从一个称为原型的对象继承属性;对象的方法通常是继承的属性;
  • JS对象是动态的——可以新增属性也可以删除属性;
  • 内置对象:由ECMAScript规范定义的对象或类;
  • 宿主对象:由JS解释器所嵌入的宿主环境定义的,如:HTMLElement对象;
  • 自定义对象:由运行中的JS代码创建的对象;
  • 自有属性:直接在对象中定义的属性;
  • 继承属性:在对象的原型对象定义的属性;

6.1 创建对象

可通过对象直接量、关键字new和(ECMAScript 5)Object.create()函数来创建。

6.1.1 对象直接量

  • 对象直接量:由若干名/值对组成的映射表,名/值对中间用冒号分隔,名/值对之间用逗号分隔,整个映射表用花括号括起来。
1
2
3
4
5
6
7
8
9
10
11
12
var empty = {};
var point = { x:point.x, y:point.y };
var book = {
"main title": "JavaScript", // 属性命名有空格,须使用字符串表示;
"sub-title": "Small", // 属性名有连字符;
"for": "all audiences", // for是保留字,须使用引号;
author: { // 这个属性的值是一个对象;
firstname: "David",
surname: "Flanagan"
}
};
// 对象直接量是一个表达式,这个表达式的每次运算都创建并初始化一个新的对象。

6.1.2 通过new创建对象

  • new运算符创建并初始化一个新对象。关键字new后跟随一个函数调用。
  • 这里的函数称做构造函数,构造函数用以初始化一个新创建的对象。
    1
    var o = new Object();           // 创建一个空对象,和{}一样;

除了这些内置构造函数,用自定义构造函数来初始化新对象也是常见的。见第9章。

6.1.3 原型

  • 每个JS对象都和另一个对象相关联;“另一个”对象就是我们熟知的原型,每个对象都从原型继承属性。
  • 通过对象直接量创建的对象都具同有一个原型对象,并可以通过Object.prototype获得对原型对象的引用
  • 通过关键字new构造函数调用创建的对象的原型就是构造函数的prototype属性的值。

6.1.4 Object.create()

  • Object.create():它创建一个新对象,其中第一个参数是这个对象的原型。第二个是可选参数,用以对对象的属性进行描述。
  • Object.create()是一个静态函数,而不是提供给某个对象调用的方法。
    1
    var o1 = Object.create({x:1, y:2});     // Object.create()创建了一个新对象,并赋值给o1;o1继承了属性x和y;

6.2 属性的查询和设置

  • JS通过点(.)或方括号([ ])运算符来获取属性的值。
  • 运算符左侧:应当是一个表达式,它返回一个对象。
  • 运算符右侧:
    • 点(.):右侧必须是一个以属性名称命名的简单的标识符;
    • 方括号([]):方括号内部必须是一个计算结果为字符串的表达式;
1
2
3
var author = book.author;
var name = book.surname;
var title = book["main title"];

6.2.1 作为关联数组的对象

  • object[“property”] => 关联数组:使用方括号和一个字符串,看起来很像数组,只是这个数组元素是通过字符串索引而不是数字索引。关联数组也称做散列、映射或字典;JS对象都是关联数组;
    • 当通过点运算符访问对象的属性时,属性名用一个标识符来表示;标识符必须直接出现在JS程序中,它们不是数据类型,因此程序无法修改它们。
    • 当通过方括号访问对象的属性时,属性名通过字符串来表示;字符串是数据类型,在程序运行时可以修改和创建它们。
      1
      2
      3
      4
      var addr = "";
      for(i = 0; i < 4; i++){
      addr += customer["address" + i] + '\n';
      }

由于在写程序的时候不知道属性名称,因此无法通过点运算符来访问对象的属性;但可以使用方括号运算符,因为它使用字符串值(字符串值是动态的,可以在程序执行时更改),而不是标识符(标识符是静态的,必须写死在程序中),作为索引对属性进行访问。

6.2.2 属性的继承

JS对象具有“自有属性”(own property),也有一些属性是从原型对象继承而来的。

  • 假设要查询对象o的属性x,如果o中不存在x,那么将会继续在o的原型对象中查询属性x;如果原型中也没有x,但这个原型对象也有原型,那么继续在这个原型对象的原型上执行查询,直到找到x或查询到下一个原型是null的对象为止。