导语
前面的系列文章,基本把JavaScript的核心知识点的基本语法、标准库等章节讲解完;
本章开始进入JavaScript核心知识点的高级部分——面向对象的程序设计,这一部分的内容将会对对象这一数据类型做进一步的深化理解,并且讲述几种创建对象的设计模式以及JavaScript独特的继承机制;
1.理解对象和面向对象的程序设计
1.1 面向对象的程序设计
"面向对象编程"(Object Oriented Programming,缩写为OOP)本身是一种编程的思维模式,它把世界的一切看作是对象的集合,世界的运转就是靠一个个对象分工、合作的结果,体现一切皆“对象”思想;
而在程序设计当中,面向对象编程就可以看做编写各个具有特定功能的对象(模块)并将它们进行有机的分工合作,即目前的模块化编程就是面向对象的程序设计的实际应用;
1.2 理解对象
对象在前面的系列文章中曾经提到,从数据特征上看,对象是无序属性(键值对)的集合;
我们可以使用字面量和构造函数的方式去创建一个最为简单的对象:
var person = new Object(); person.name = "teren"; person.age = 18; person.greet = function(){ console.log("hello "+this.name); } var teren = { name:"teren", age:18, greet:function(){ console.log("hello "+this.name); } }
通常创建一个简单的对象,都是采用字面量的方式;
上面的对象就是对现实对象的一种抽象表达;
1.3 对象的属性类型
前面章节中我们使用delete命令可以删除一些对象的属性,有一些又不可以,使用Object.keys()方法只能遍历可枚举属性,那么对象的属性是否有一些特性是我们尚未了解的呢?
ES5提供了一种只有内部才用的特性(attribute)去描述对象的属性(property)的各种特性,使用[[attribute]]表示,在JavaScript中不能直接访问它们;
一个我们非常熟悉的栗子就是Number构造函数构造出来的实例对象;
我们无法直接访问num.[[PrimitiveValue]]
,这一属性,只能通过num.valueOf()
访问该值;
ES5中定义对象属性的两种特性,数据特性和访问器特性,对象属性可以兼备这两种特性;
数据特性定义对象的属性值的特性,一个属性值可以包括以下四个数据特性:
[[Value]]:存放属性值; [[Writable]]:是否可写属性; [[Enumerable]]:是否为可枚举属性; [[Configurable]]:是否可用delete命令删除;
访问器特性定义对象的属性在访问属性和设置属性时调用的两个函数getter和setter;