第6章 面向对象的程序设计

第6章 面向对象的程序设计

6.1 理解对象

6.1.1 属性类型

6.1.2 定义多个属性

6.1.3 读取属性的特征

6.2 创建对象

6.2.1 工厂模式

6.2.2 构造函数模式

6.2.3 原型模式

6.2.4 组合使用构造函数模式和原型模式

6.2.5 动态原型模式

6.2.6 寄生构造函数模式

6.2.6 稳妥构造函数模式

6.3 继承

6.3.1 原型链

6.3.2 借用构造函数

6.3.3 组合继承

6.3.4 原型式继承

6.3.5 寄生式继承

6.3.6 寄生组合式继承

6.4 小结

章节内容详解

6.1 理解对象

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

6.1.1 属性类型

ECMAScript中有两种属性:数据属性和访问器属性。
数据属性
数据属性包含一个数据值的位置。在这个位置可以读取和写入值。数据属性有4个描述其行为的特性:

  • [[Confingruable]] : 表示能否通过delete删除属性从而重新定义属性,能否修改属性的特性,或者能否把属性修改为访问器属性。像前面例子中那样直接在对象上定义的属性,他们这个特性默认值为true
  • [[Enumerable]] : 表示能否通过 for-in 循环返回属性。像前面例子中那样直接在对象上定义的属性,他们的这个特性默认值为true
  • [[Writable]] : 表示能否修改属性的值。像前面例子中那样直接在对象上定义的属性,他们的这个特性默认值为true
  • [[Value]] : 包含这个属性的数据值。读取属性值的时候,从这个位置读;写入属性值的时候,把新值保存在这个位置。这特性的默认值为undefined

要修改默认属性的特性,必须使用ECMAScript5的Object.defineProperty()方法。这个方法接收三个参数:属性所在的对象、属性的名字和一个描述符对象。其中,描述符对象的属性必须是:configurable、enumerable、writable和value。设置其中的一或多个值,可以修改对象的特性值。例如:

var person = {};
Object.defineProperty(person,"name",{
    writable:false,
    value:"Nicholas"
});
console.log(person.name);//Nicholas
person.name="Tom";
console.log(person.name);//Nicholas

因为name是设置的只读读写,所以在非严格模式下,赋值操作会被忽略,严格模式下,赋值操作会报错

访问属性
访问器属性包含一对getter和setter属性(不过,这两个函数都不是必须的),在读取访问器属性时,会调用getter函数,这个函数负责返回有效的值;在写入访问器属性时,会调用setter函数并传入新值,这个函数负责决定如何处理数据。访问器属性如下4个特性:

  • [[Confingruable]] : 表示能否通过delete删除属性从而重新定义属性,能否修改属性的特性,或者能否把属性修改为访问器属性。像前面例子中那样直接在对象上定义的属性,他们这个特性默认值为true
  • [[Enumerable]] : 表示能否通过 for-in 循环返回属性。像前面例子中那样直接在对象上定义的属性,他们的这个特性默认值为true
  • [[Get]] : 在读取属性时调用的函数。默认值为undefined
  • [[Set]] : 在写入属性时调用的函数。默认值为undefined

你可能感兴趣的:(第6章 面向对象的程序设计)