JavaScript 中定义对象的几种方式

作者 魏楷聪 发布于 2015年01月20日

一种面向对象语言需要向开发者提供四种基本能力:

1. 封装 - 把相关的信息(无论数据或方法)存储在对象中的能力

2. 聚集 - 把一个对象存储在另一个对象内的能力

3. 继承 - 由另一个类(或多个类)得来类的属性和方法的能力

4. 多态 - 编写能以多种方法运行的函数或方法的能力

在JavaScript中,所有对象都是从Object对象继承过来的。Object中的属性都是不可枚举的(propertyIsEnumerable返回false),因此无法通过for...in语句得到其中的属性。

在JavaScript中,可以动态添加对象的属性,也可以动态删除对象的属性。

JavaScript 中定义对象的几种方式_第1张图片
动态添加对象的属性,动态删除对象的属性
JavaScript 中定义对象的几种方式_第2张图片
定义对象最常见的方式


1) 基于已有对象扩充其属性和方法

JavaScript 中定义对象的几种方式_第3张图片
关键字this总是指向调用该方法的对象

最后一个属性sayName实际上是指向函数的指针,意味着该属性是个方法。

2) 工厂方式(factory function)

JavaScript 中定义对象的几种方式_第4张图片
工厂方式创建对象
JavaScript 中定义对象的几种方式_第5张图片
带参数的构造方法
JavaScript 中定义对象的几种方式_第6张图片
让一个函数对象被多个对象所共享,而不是每一个对象拥有一个函数对象
使用this,即可在任意多个地方重用同一个函数

注意:引用对象的属性时,必须使用this关键字。

function get(){

       alert(username + ", " + password);

}

如果不用对象或this关键字引用变量,ECMAScript就会把它看作局部变量或全局变量。然后该函数将查找名为color的局部或全局变量,但是不会找到。结果该函数将报“username未定义”的错误。

3) 构造函数方式

JavaScript 中定义对象的几种方式_第7张图片
构造函数方式
JavaScript 中定义对象的几种方式_第8张图片
可以在构造对象时传递参数

4) 原型(“prototype”)方式

能用 instanceof 运算符检查给定变量指向的对象的类型:

alert(person1 instanceof Person);  // outputs "true"

JavaScript 中定义对象的几种方式_第9张图片
使用原型(prototype)方式创建对象,所有属性类型均为基本类型
利用对象的prototype属性,可把它看成创建新对象所依赖的原型
调用new Person()时,原型的所有属性都被立即赋予要创建的对象,
意味着所有Person实例存放的都是指向getInfo()函数的指针
JavaScript 中定义对象的几种方式_第10张图片
使用原型(prototype)方式创建对象,其中username属性类型为引用类型
由于username是引用值,Person的两个实例都指向同一个数组

如果使用原型方式对象,那么生成的所有对象会共享原型中的属性,这样一个对象改变了该属性(引用值)也会反映到其它对象当中。

JavaScript 中定义对象的几种方式_第11张图片

单纯使用原型方式定义对象无法在构造函数中为属性赋初值,只能在对象生成后再去改变属性值。

使用原型+构造函数方式来定义对象,对象之间的属性互不干扰,各个对象间共享同一个方法。

JavaScript 中定义对象的几种方式_第12张图片
用构造函数定义对象的所有非函数属性
用原型方式定义对象的函数属性(方法)
所有函数都只创建一次(没有内存浪费),而每个对象都具有自己的对象属性实例

5) 动态原型方式:在构造函数中通过标志量让所有对象共享一个方法,而每个对象拥有自己的属性

JavaScript 中定义对象的几种方式_第13张图片
动态原型方式

(完)

你可能感兴趣的:(JavaScript 中定义对象的几种方式)