前言:
在我们深入 面向对象编程之前 ,让我们先理解一下Javascript的 对象(Object),我们可以把ECMAScript对象想象成散列表,其值无非就是一组名值对,其中值可以是数据或者函数;
主要内容
1.1 理解并创建对象
- 创建自定义对象最简单方式—— 使用对象字面量
-
var car = { "wheels":4, "engines":1, "seats":5 };
- 除了上一种方法外,我们还可以使用构造函数来创建对象。
构造函数 通常使用大写字母开头,以便把自己和其他普通函数区别开。
下面便是一个 构造函数 了:
-
var Car = function() { this.wheels = 4; this.engines = 1; this.seats = 1; };
在 构造函数 中,
this
指向被此 构造函数 创建出来的 对象 。 -
var myCar = new Car();
myCar现在成为Car的一个实例。使用
new
关键字 去调用构造函数。因为只有这样,Javascript才知道这是要去构造一个新 对象 ,并且把构造函数中的 this
指向这个新对象- 使用Object.create()创建一个具有指定原型且可选择性地包含指定属性的对象。
var obj = Object.create({ foo: 1 }, { // foo is an inherit property. bar: { value: 2 // bar is a non-enumerable property. }, baz: { value: 3, enumerable: true // baz is an own enumerable property. } });
1.2 属性类型
1.数据属性:数据属性包含一个数据值的位置,在这个位置可以读取和写入值.言下之意即,数据属性是可以直接通过对象.属性
的形式访问和赋值的。
- [[Configurable]]
- [[Enumerable]]
- [[Writable]]
- [[Value]]
var person = { name : "Nicholas" } //里面的name属性是数据属性
Object.defineProperty()方法接收三个参数,属性所在的对象,属性的名字和一个描述符对象。设置其中一个或多个值,可以修改对应的特性值。
通过 Object.defineProperty()
方法,可以创建数据属性(并设定其[[Enumerable]]等内部属性),也可以创建访问器属性(访问器属性仅包含 getter
和 setter
函数,当然这两个也不是必须的)。
2.访问器属性:允许用户在赋值或取值都经过预先设定的函数,从而实现内部属性的那一种特殊效果。
- [[Configurable]]
- [[Enumerable]]
- [[Get]]
- [[Set]]
举个例子
var book = { _year : 2004,//_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
上述中,book.year 是访问器属性。直接调用 book.year
,即调用了这个访问器属性中定义的 get
方法,返回 book._year
这个数据属性。如果给 book.year
赋值,就是调用了这个访问器属性中定义的 set
方法。
默认值
如果你不明确的指定某个特性的值,则它们会被赋一个默认值:
特性名称 | 默认值 |
[[Value]] | undefined |
[[Get]] | undefined |
[[Set]] | undefined |
[[Writable]] | false |
[[Enumerable]] | false |
[[Configurable]] | false |
这些默认值对于属性描述符尤其重要.