浅谈JavaScript的面向对象程序设计(三)

  前面已经对JavaScript的面向对象程序设计作了简单的介绍,包括了对象的属性、对象的工厂模式、构造函数和原型等。通过介绍,这些创建对象的方法依然有不少优化和改进的地方。

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

  创建自定义类型的最常用方式就是使用组合构造函数和原型模式。构造函数用于定义实例属性,原型用于定义共享的属性和方法。每个实例都有自己的实例副本,同时又共享了原型属性和方法,节省了内存。还支持向函数传递参数。

  

 function Person(name,age,sex){
this.name=name;
this.age=age;
this.sex=sex;
}
Person.prototype={
constructor:Person,
getName:function(){
return this.name;
}
}
var person1 = new Person("jack",18,"man");
var person2 = new Person("helen",19,"woman");
console.log(person1.getName());//jack
console.log(person2.getName());//helen
console.log(person1.getName===person2.getName);//true

  上面的代码中,实例属性都是在构造函数中定义的。在原型中定义了contructor和getName方法,原型中的方法由所有的实例共享。14行和15行输出的结果不相同,因为实例属性定义再构造函数中,而16行输出true,则证明两个实例的getName指向同一个栈内存。

动态原型模式

  上面的例子中,我们将函数的声明和原型的定义是分开的。为了解决这一点,我们可以在构造函数中初始化原型。

  

 function Person(name,age,sex){
this.name=name;
this.age=age;
this.sex=sex;
if(typeof this.getName!="function"){
Person.prototype.getName=function(){
return this.name;
}
}
}
var person1 = new Person("jack",18,"man");
var person2 = new Person("helen",19,"woman");
console.log(person1.getName());//jack
console.log(person2.getName());//helen
console.log(person1.getName===person2.getName);//true

  上面的代码中,我们在构造函数中声明了属性以及原型的方法。但是我们在5行有判断,只有当函数不存在的时候才调用,避免了函数的多次调用。

寄生构造函数模式

  通常情况下,我们使用上面的几种模式已经可以满足多种创建对象的需求了。JavaScript还为我们提供了寄生构造函数模式。这种模式的基本思想是创建一个函数,该函数仅仅是用来封装对象的代码,并返回创建的对象。

 function Person(name,age,sex){
var obj =new Object();
obj.name=name;
obj.age=age;
obj.sex=sex;
obj.getName=function(){
return this.name;
}
return obj;
}
var person = new Person("jack",18,"man");
console.log(person.getName());//jack

  上面的代码使用寄生构造函数模式创建了对象person,上面的对象,除了用new 来构造对象外,其他的与工厂模式创建对象的过程是一致的。通过寄生构造函数模式创建的对象,与构造函数本身并没有关系,构造函数返回的对象与在构造函数创建的对象并没有关系。不能通过instanceof来确定对象的类型。

上一篇:mysql高性能6章总结(下) mysql查询优化


下一篇:C++面向对象程序设计第三章习题答案解析