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

【转】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基于原型继承的面向对象系统的...

    原型设计模式prototype

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

    学用 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的设计模式教程.zip

    创建型设计模式包括简单工厂模式、工厂方法模式、抽象工厂模式、生成器模式、原型模式和单例模式,帮助开发者理解如何有效地创建和管理对象。 结构型设计模式包括适配器模式、桥接模式、组合模式、装饰器模式、...

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

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

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

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

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

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

    【JavaScript设计模式】根据曾探所著《JavaScript设计模式与开发实践》整理的学习笔记_pgj.zip

    曾探所著的《JavaScript设计模式与开发实践》是一本专注于JavaScript语言的模式与实践的书籍,它不仅涵盖了传统设计模式的JavaScript实现,还包括了更多符合JavaScript语言特性的模式探索。这本书为JavaScript开发者...

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

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

    JavaScript 设计模式.zip

    JavaScript 设计模式是编程领域中一个十分重要的概念,它关乎代码的组织、扩展性和维护性。设计模式是一套被反复使用、多数人知晓、经过分类编目、代码设计经验的总结。使用设计模式是为了可重用代码、让代码更容易...

    JavaScript模式中文[pdf] 百度云

     第7章 设计模式  单体模式  工厂模式  迭代器模式  装饰者模式  策略模式  外观模式  代理模式  中介者模式  观察者模式  小结  第8章 DOM和浏览器模式  关注分离  DOM脚本  事件  长期运行脚本  ...

    JavaScript设计模式_hy5.zip

    在JavaScript中,最为常见的设计模式包括:单例模式、工厂模式、构造器模式、原型模式、观察者模式、策略模式、装饰器模式、适配器模式、中介者模式、命令模式、迭代器模式、组合模式、享元模式、代理模式等。...

    【JavaScript设计模式】根据曾探所著《JavaScript设计模式与开发实践》整理的学习笔记.zip

    在JavaScript中,由于其基于原型的继承和函数式编程的特性,某些设计模式的实现会与传统面向对象编程语言有所不同。例如,JavaScript中的原型链可以用来实现单例模式,而在其他语言中可能会用类来实现。同样,...

    javascript设计模式.zip

    javascript设计模式JavaScript 模式《JavaScript模式》中译本-《JavaScript模式》作者Stoyan Stefanov拔赤偷懒是程序员的优质品质,模式抢先大家总结的偷懒招式。Stoyan Stefanov的这本书,从JavaScript的实际使用...

    【JavaScript】《javascript设计模式》(源码和学习总结)_pgj.zip

    JavaScript作为一门灵活多变的语言,其函数式编程特性、原型继承机制以及异步编程模式等都对设计模式的实现和使用提出了特别的要求和挑战。 为了更好地学习和应用这些模式,书中可能会建议读者进行一些练习,如重构...

Global site tag (gtag.js) - Google Analytics