`
wb1991wb
  • 浏览: 157218 次
  • 来自: 上海
社区版块
存档分类
最新评论

【转】javascript原型设计模式

阅读更多

在JavaScript中创建对象,对于JavaScript开发者来说,会有很多种方法去创建,本文将剖析JavaScript原型设计模式,在大多数地方,可以使用这种原型属性来分享对象中的实例方法。

1.定义内部方法(Defining Methods Internally)

在所有创建对象的方式中,这大概是最简单,最直观的方式了。使用function定义构造函数,在设置所有对象的属性和方法时,只要在前面追加this就可以了。你或许没有意识到,这个特殊的模型是非常耗内存的,原因就是这个getInfo()方法在每次新建一个实例时都要被创建,如果你仅仅是创建几个对象,那么也不会占太多的内存。

  1. function Car(make, model, level, color, warranty) {  
  2.     this.make     = make;  
  3.     this.model    = model;  
  4.     this.level    = level;  
  5.     this.color    = color;  
  6.     this.warranty = warranty;  
  7.     this.getInfo = function() {  
  8.         return this.make + ', ' + this.model + ', ' + this.level + ', 'this.color + ', ' + this.warranty;  
  9.     };  
  10. }  
  11. var aCar = new Car('Acura''TL''Sport''blue', 5);  
  12. alert(aCar.getInfo());  //displays Acura, TL, Sport, blue, 5  

2.添加外部原型(Methods Added Externally to the Prototype)

通过给对象方法添加构造函数原型来分享所有对象方法。首先要定义构造函数和属性,然后把方法添加到函数原型属性中。这样做的好处是你可以随时添加方法并且被该类型的所有对象(即使是已经被实例化的对象)识别。

  1. function Car(make, model, level, color, warranty) {  
  2.     this.make     = make;  
  3.     this.model    = model;  
  4.     this.level    = level;  
  5.     this.color    = color;  
  6.     this.warranty = warranty;  
  7. }  
  8.  
  9. Car.prototype.getInfo = function() {  
  10.     return this.make + ', ' + this.model + ', ' + this.level + ', 'this.color + ', ' + this.warranty;  
  11. };  
  12.  
  13. var aCar = new Car('Acura''TL''Sport''blue', 5);  
  14. alert(aCar.getInfo());  //displays Acura, TL, Sport, blue, 5  
  15.  
  16. Car.prototype.accelerate = function() {  
  17.     return 'How fast?';  
  18. };  
  19. alert(aCar.accelerate()); //displays "How fast?" 

3.原型模式(The Prototype Pattern)

比前面那个例子稍微先进点的方式,用原型实例指定创建对象的种类,并且通过拷贝这些原型创建新的对象。在功能上,这两个模型并没有什么不同,它可以将所有的方法组合在一起。

  1. function Car(make, model, level, color, warranty) {  
  2.     this.make     = make;  
  3.     this.model    = model;  
  4.     this.level    = level;  
  5.     this.color    = color;  
  6.     this.warranty = warranty;  
  7. }  
  8. Car.prototype = {  
  9.     getInfo: function () {  
  10.       return this.make + ', ' + this.model + ', ' + this.level + ', 'this.color + ', ' + this.warranty;  
  11.     }  
  12. };  

4.The Revealing Prototype Pattern

与之前的模式比起来,这种对象的创建会有很多显著的效果,第一个是在一个构造函数中,它可以包围所有对象的属性和方法。第二个优点是我们可以定义私有对象成员,并且通过用var关键字定义本地变量。

  1. var Car = function(make, model, level, color, warranty) {  
  2.     var _make     = make,  
  3.         _model    = model,  
  4.         _level    = level,  
  5.         _color    = color,  
  6.         _warranty = warranty;   
  7.     return {  
  8.       getInfo: function () {  
  9.         return _make + ', ' + _model + ', ' + _level + ', '+ _color + ', ' + _warranty;  
  10.       }  
  11.     };  
  12. };  

5.Extending the Revealing Prototype Pattern

然而,Revealing Prototype Pattern的另外一个突出优点是,它使扩展和/或覆盖现有的功能更直接一点。让我们来扩展Car对象,通过定义它的构造函数和分配一个新的Car实例给UsedCar原型去创建一个UsedCar

  1. var UsedCar = function(mileage) {  
  2.     //Define a variable unique to each instance of UsedCar  
  3.     this.mileage = mileage;  
  4. };  
  5. UsedCar.prototype = new Car('Honda''Civic''LX''gray', 2);  

同样,我们可以重写Car对象的功能仅仅用相同的函数名字来替换它,通过扩展我们可以重用getInfo()这个方法,这样对UsedCar会有好处的。我们可以从UsedCar的原型中获得getInfo()方法,因为我们构建了一个Car实例在这。使用封闭,我们可以追加UsedCar的里程,通过getInfo()这个方法进行输出。

  1. var UsedCar = function(mileage) {  
  2.     //Define a variable unique to each instance of UsedCar  
  3.     this.mileage = mileage;  
  4. };  
  5.  
  6. UsedCar.prototype = new Car('Honda''Civic''LX''gray', 2);  
  7. var aUsedCar = new UsedCar(50000);  
  8. alert(aUsedCar.getInfo()); //displays Honda, Civic, LX, gray, 2  
  9. //this will add the mileage to getInfo()'s output  
  10. UsedCar.prototype.getInfo = function(superGetInfo) {  
  11.   return function() { return superGetInfo() + ', 'this.mileage; };  
  12. }(UsedCar.prototype.getInfo);  
  13.  
  14. alert(aUsedCar.getInfo()); //displays Honda, Civic, LX, gray, 2, 50000  

以上我们总结了在JavaScript中最常见的几种原型模式,如果你有其他不同的见解,可以留言与我们讨论。

 

分享到:
评论

相关推荐

    JavaScript设计模式与开发实践.pdf

    第一部分讲解了JavaScript语言的面向对象和函数式编程的知识,包括静态类型语言和动态类型语言的区别及其在实现设计模式时的异同、封装、继承、多态在动态类型语言中的体现、JavaScript基于原型继承的面向对象系统的...

    JavaScript 设计模式(高清扫描版本)- 张容铭

    此外,张容铭的这本书很可能还会深入讨论JavaScript语言特性如何与设计模式相结合,例如原型继承、闭包和动态类型等在实现设计模式时的独特作用。书中可能会有丰富的实例和代码示例,帮助读者理解和实践这些模式。 ...

    JavaScript设计模式+JavaScript模式+JavaScript异步编程

    设计模式和异步编程是提升JavaScript代码质量和效率的关键。以下将详细介绍这三本书所涵盖的知识点: 1. **JavaScript设计模式**: 设计模式是软件工程中经过实践验证的、解决常见问题的有效方法。在JavaScript中...

    学用JavaScript设计模式

    因为JavaScript是基于原型的面向对象语言,它在设计模式上的应用有其独特之处。例如,在JavaScript中,我们经常会利用函数作用域和闭包来模拟私有方法和私有属性,以及使用原型链来模拟类继承。 最后,本书提供了...

    原型设计模式prototype

    **原型设计模式(Prototype Pattern)**是一种创建型设计模式,它允许我们通过复制现有的对象来创建新对象,而不是通过构造函数来实例化新对象。在面向对象编程中,当我们需要频繁地创建具有相同或相似属性的对象时,...

    Javascript 设计模式 电子书

    在深入探讨《Javascript 设计模式》这本电子书之前,需要先理解设计模式的含义及其在软件开发中的重要性。设计模式是软件工程领域中经过时间验证的一套最佳实践和解决方案,它们针对特定问题提供了模板化设计方案。...

    Javascript 设计模式 很经典 第一本

    除了介绍基本的设计模式,《Pro JavaScript Design Patterns》还深入探讨了JavaScript的一些高级特性,如闭包、原型链、异步编程等,以及如何利用这些特性来实现更高效的设计模式。 1. **闭包**:闭包允许一个函数...

    精通javascript设计模式en版pdf

    **JavaScript设计模式:深入理解与应用** 在编程领域,设计模式是解决常见问题的经验总结,它们代表了软件设计的最佳实践。对于JavaScript这种广泛应用于Web开发的动态语言来说,设计模式同样至关重要。《精通...

    javascript 设计模式

    在JavaScript中,由于其特殊的原型继承机制和动态类型特性,设计模式的应用有一些独特的特点。 ### 1. 继承机制 在JavaScript中,继承主要通过原型链(Prototype Chain)实现。每个对象都有一个`__proto__`属性,...

    外文翻译:学用JavaScript设计模式

    ### 外文翻译:学用JavaScript设计模式 #### 序言与重要性 设计模式作为软件工程中的一个重要组成部分,其核心在于提供了一套标准的方法论,帮助开发人员以优雅、高效的方式解决常见的软件设计问题。《学用...

    学用 JavaScript 设计模式.pdf

    外文翻译:学用JavaScript设计模式,pdf版本,中文版 设计模式是可重用的用于解决软件设计中一般问题的方案。设计模式如此让人着迷,以至在任何编程语言中都有对其进行的探索。 其中一个原因是它可以让我们站在巨人...

    javascript 面向对象编程.pdf javascript 设计模式与开发实践.pdf

    面向对象编程(Object-Oriented Programming, OOP)是JavaScript中的核心概念,而设计模式则是解决常见编程问题的经验总结,对于提升代码质量和可维护性至关重要。这两本书——"JavaScript 面向对象编程.pdf"和...

    JavaScript高级与设计模式.zip

    在这个"JavaScript高级与设计模式"的主题中,我们将深入探讨JavaScript的高级特性以及如何在实践中应用设计模式。 首先,让我们关注JavaScript的高级特性。这些特性包括但不限于: 1. **闭包(Closures)**:闭包...

    Javascript 设计模式系统讲解与应用视频资源地址.7z

    JavaScript设计模式是编程实践中的一种重要思想,它提供了一套经过时间考验的最佳实践,用来解决常见的编程问题和提高代码的可维护性、可扩展性和可复用性。在JavaScript这种动态类型的脚本语言中,设计模式尤其重要...

    Javascript 设计模式系统讲解与应用

    在深入探讨《JavaScript设计模式系统讲解与应用》的内容之前,我们先来了解一下设计模式的基本概念以及为什么它对于前端开发人员尤为重要。设计模式是一套被反复使用的、经过分类编目的、包含结构化的解决方案,用于...

    JavaScript设计模式与开发实践_himppf_js_jspremise_精通javascript_Js设计模式_

    JavaScript设计模式与开发实践是深入理解并提升JavaScript编程能力的关键领域。设计模式是对在软件设计中经常出现的问题的解决方案的描述,它代表了最佳实践,是经验丰富的开发者们经过时间检验后总结出来的解决常见...

    Javascript 设计模式之构造函数模式.zip

    JavaScript设计模式是编程实践中一种优秀的代码组织方式,它总结了在特定场景下解决常见问题的最佳实践。构造函数模式是JavaScript中的一种重要设计模式,用于创建对象。本文将深入探讨构造函数模式及其应用。 构造...

    基于JavaScript原型和ES6类的23种GoF设计模式源码

    本项目提供JavaScript中23种GoF设计模式的源码实现,涵盖92个JavaScript文件,辅以2个YAML文件、2个Markdown文件、以及其他必要的配置文件。通过使用原型和ES6类,这些模式被精炼地呈现,方便开发者快速理解和应用。

Global site tag (gtag.js) - Google Analytics