前面已经对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来确定对象的类型。

最新文章

  1. php中rsa加密解密验证
  2. linux下的chmod,chown和chgrp
  3. Python学习 之 编程
  4. hdu 1272
  5. Thinking in java——Generics
  6. BufferedReader的ready与readLine使用,以及Premature EOF异常
  7. 记录一次webbrowser无法加载 activex 遇到的问题
  8. 【翻译】C#和.NET核心快速参考
  9. Hibernate(十二):HQL查询(一)
  10. apache安装软负载的配置说明
  11. OrCAD Capture CIS 16.6 从PDF文档中提取引脚定义,实现快速地编辑Part的引脚名称
  12. python 基础之变量存储缓存机制与数据驻留小数据池
  13. 自动化测试工具Ranorex的录制功能使用
  14. 论文笔记之:DualGAN: Unsupervised Dual Learning for Image-to-Image Translation
  15. U3D中可以直接使用GL!!!
  16. SimpleScalar Course Project
  17. asp.net core 发布到docker 极简步骤
  18. 链接错误 multiply defined (by misc_1.o and misc.o).
  19. 【LeetCode】81. Search in Rotated Sorted Array II (2 solutions)
  20. Java 循环结构

热门文章

  1. [LOJ] 分块九题 1
  2. 8. Truncate undo表空间
  3. tornado框架基础11-tornado异步
  4. Android获取屏幕大小(Px)
  5. Vijos 1308 埃及分数(迭代加深搜索)
  6. NGINX模块(一)
  7. jenkins在linux环境搭建-公司系统
  8. JavaScript变量声明提升
  9. Personal Recommendation Using Deep Recurrent Neural Networks in NetEase读书笔记
  10. ZOJ 3811 Untrusted Patrol【并查集】