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

【转】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 设计模式系统讲解与应用

    在深入探讨《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类,这些模式被精炼地呈现,方便开发者快速理解和应用。

    JavaScript模式中文[pdf] 百度云

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

    javascript设计模式.zip

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

    前端设计模式大全,包括工厂模式,原型模式,构造器模式等

    本资料集包含了多种重要的前端设计模式,如工厂模式、原型模式和构造器模式,下面将详细阐述这些模式的核心概念和应用。 1. 工厂模式: 工厂模式是一种创建型设计模式,它提供了一种创建对象的最佳方式,通过抽象出...

    【JavaScript源代码】怎样用JavaScript实现原型模式.docx

    原型模式是JavaScript中最基础也是最核心的设计模式之一。通过上述两种方法,我们可以灵活地在JavaScript中实现原型模式。此外,深入理解原型、原型链以及`prototype`、`__proto__`、`constructor`等属性对于掌握...

    学用 JavaScript 设计模式

    在JavaScript中,设计模式的学习和应用能够帮助开发者利用这门语言的特性,编写出更加模块化、易于维护和复用的代码。 具体到JavaScript设计模式,有多种类型可以利用,包括: 1. 构造器模式:通过构造函数创建...

    JavaScript设计模式与开发实践1

    这部分重点讨论了JavaScript的动态类型特性,如封装、继承、多态,并详细阐述了基于原型继承的面向对象系统的工作原理,为后续学习设计模式打下坚实基础。 第二部分是书中的核心内容,作者通过逐步完善示例代码的...

    JavaScript模式(中文版带目录)

    在JavaScript中,由于其独特的原型继承和动态类型,理解并运用设计模式能帮助开发者编写更高效、更易于维护的代码。 二、基本技巧 这部分可能涵盖变量作用域、闭包、异步编程(如回调函数、Promise、async/await)...

    《Javascript 设计模式》课程代码源码

    JavaScript设计模式是编程实践中的一种重要思想,它提供了一套经过时间考验的最佳实践,用来解决常见的编程问题和提高代码的可维护性、可扩展性和可复用性。在本《JavaScript设计模式》课程的源码中,我们可以深入...

Global site tag (gtag.js) - Google Analytics