作者 魏楷聪 发布于 2015年01月20日
一种面向对象语言需要向开发者提供四种基本能力:
1. 封装 - 把相关的信息(无论数据或方法)存储在对象中的能力
2. 聚集 - 把一个对象存储在另一个对象内的能力
3. 继承 - 由另一个类(或多个类)得来类的属性和方法的能力
4. 多态 - 编写能以多种方法运行的函数或方法的能力
在JavaScript中,所有对象都是从Object对象继承过来的。Object中的属性都是不可枚举的(propertyIsEnumerable返回false),因此无法通过for...in语句得到其中的属性。
在JavaScript中,可以动态添加对象的属性,也可以动态删除对象的属性。
1) 基于已有对象扩充其属性和方法
最后一个属性sayName实际上是指向函数的指针,意味着该属性是个方法。
2) 工厂方式(factory function)
使用this,即可在任意多个地方重用同一个函数
注意:引用对象的属性时,必须使用this关键字。
function get(){
alert(username + ", " + password);
}
如果不用对象或this关键字引用变量,ECMAScript就会把它看作局部变量或全局变量。然后该函数将查找名为color的局部或全局变量,但是不会找到。结果该函数将报“username未定义”的错误。
3) 构造函数方式
4) 原型(“prototype”)方式
能用 instanceof 运算符检查给定变量指向的对象的类型:
alert(person1 instanceof Person); // outputs "true"
利用对象的prototype属性,可把它看成创建新对象所依赖的原型
调用new Person()时,原型的所有属性都被立即赋予要创建的对象,
意味着所有Person实例存放的都是指向getInfo()函数的指针
由于username是引用值,Person的两个实例都指向同一个数组
如果使用原型方式对象,那么生成的所有对象会共享原型中的属性,这样一个对象改变了该属性(引用值)也会反映到其它对象当中。
单纯使用原型方式定义对象无法在构造函数中为属性赋初值,只能在对象生成后再去改变属性值。
使用原型+构造函数方式来定义对象,对象之间的属性互不干扰,各个对象间共享同一个方法。
用原型方式定义对象的函数属性(方法)
所有函数都只创建一次(没有内存浪费),而每个对象都具有自己的对象属性实例
5) 动态原型方式:在构造函数中通过标志量让所有对象共享一个方法,而每个对象拥有自己的属性
(完)