`

JavaScript中对象的构造方法

 
阅读更多

 

第一种方式: 工厂方法 
能创建并返回特定类型的对象的工厂函数(factory function)。 
Javascript代码 
  1. function createCar(sColor){  
  2.   var oTempCar = new Object;  
  3.   oTempCar.color = sColor;  
  4.   oTempCar.showColor = function (){  
  5.     alert(this.color);  
  6.   };  
  7.   return oTempCar;  
  8. }  
  9. var oCar1 = createCar();  
  10. var oCar2 = createCar();  

调用此函数时,将创建新对象,并赋予它所有必要的属性。使用此方法将创建car对象的两个版本(oCar1和oCar2),他们的属性完全一样。 
使用此方法存在的问题: 
1语义上看起来不像使用带有构造函数的new运算符那么正规。 
2使用这种方式必须创建对象的方法。每次调用createCar(),都要创建showColor(),意味着每个对象都有自己的showColor()版本,事实上,每个对象都共享了同一个函数。 
有些开发者在工厂函数外定义对象的方法,然后通过属性指向该方法。从而避免这个问题: 
Js代码 
  1. function createCar(sColor){  
  2.   var oTempCar = new Object;  
  3.   oTempCar.color = sColor;  
  4.   oTempCar.showColor = showColor;  
  5.   return oTempCar;  
  6. }  
  7. function showColor(){  
  8.    alert(this.color);  
  9. }  

在这段重写的代码中,在函数createCar()前定义了函数showColor().在createCar()内部,赋予对象一个已经指向已经存在的showColor()函数的指针。从功能上来讲,这样解决了重复创建对象的问题,但该函数看起来不像对象的方法。 
所有这些问题引发了开发者定义的构造函数的出现。 

第二种方式:构造函数方式
 
Js代码 
  1. function Car(sColor){  
  2.   this.color = sColor;  
  3.   this.showColor = function (){  
  4.     alert(this.color);  
  5.   };  
  6. }  
  7. var oCar1 = new Car("red");  
  8. var oCar2 = new Car("blue");  

你可能已经注意到第一个差别了,在构造函数内部无创建对象,而是使用this关键字。使用new运算符调用构造函数时,在执行第一行代码前先创建一个对象,只有用this才能访问该对象。然后可以直接赋予this属性,默认情况下是构造函数的返回值(不必明确使用return运算符)。 
这种方式在管理函数方面与工厂方法一样都存在相同的问题。 

第三种方式:原型方式 
Js代码 
  1. function Car(){  
  2.    
  3. }  
  4. Car.prototype.color = "blue";  
  5. var oCar1 = new Car();  
  6. var oCar2 = new Car();  

调用new Car()时,原型的所有属性都被立即赋予要创建的对象,意味着所有的Car实例存放的都是指向showColor()函数的指针。从语义上看起来都属于一个对象,因此解决了前面两种方式存在的两个问题。此外使用该方法,还能用instanceof运算符检查给定变量指向的对象类型。因此,下面的代码将输出true: 
alert(oCar instanceof Car); //outputs "true" 
这个方式看起来很不错,遗憾的是,它并不尽如人意。 
1首先这个构造函数没有参数。使用原型方式时,不能给构造函数传递参数初始化属性的值,因为car1和car2的属性都等于“red”。 
2真正的问题出现在属性指向的是对象,而不是函数时。函数共享不会造成任何问题,但是对象却很少被多个实例共享的。 

第四种方式:混合的构造函数/原型方式(推荐) 
联合使用构造函数和原型方式,就可像用其他程序设计语言一样创建对象。这种概念非常简单,即用构造函数定义对象的所有非函数属性,用原型方式定义对象的函数属性(方法)。 
Js代码 
  1. function Car(sColor){  
  2.   this.color =sColor;  
  3.   this.drivers =new Array("Mike","Sue");  
  4. }  
  5. Car.prototype.showColor = function(){  
  6.   alert(this.color);  
  7. }  
  8. var oCar1 =new Car("red");  
  9. var oCar2 =new Car("blue");  
  10.   
  11. oCar1.drivers.push("Matt");  
  12.   
  13. alert(oCar1.drivers);   //outputs "Mike,Sue,Matt"  
  14. alert(oCar1.drivers);   //outputs "Mike,Sue"  


第五种方式:动态原型方式(推荐) 
对于习惯使用其他语言的开发者来说,使用混合的构造函数/原型方式感觉不那么和谐。批评混合的构造函数/原型方式的人认为,在构造函数内找属性,在外部找方法的做法很不合理。所以他们设计了动态原型方式,以提供更友好的编码风格。 
动态原型方法的基本想法与混合的构造函数/原型方式相同,即在构造函数内定义非函数属性,而函数属性则利用原型属性定义。唯一的区别是赋予对象方法的位置。下面是使用动态原型方法重写的Car类: 
Js代码 
  1. function Car(sColor){  
  2.   this.color =sColor;  
  3.   this.drivers =new Array("Mike","Sue");  
  4.   
  5.   if(typeof Car._initialized == "undefined"){  
  6.     Car.prototype.showColor = function(){  
  7.       alert(this.color);  
  8.     }  
  9.   }  
  10.   Car._initialized = true;  
  11. }  

分享到:
评论

相关推荐

    Javascript中获取对象的原型对象的方法小结

    在Javascript中,如果我们有一个对象但是又不知道它的构造函数时,如何获取它的原型对象呢? 在Chrome中或是FireFox浏览器中,我们可以直接使用对象的__proto__属性获取它的原型对象。 代码如下: <!– lang: js ...

    JavaScript 三种创建对象的方法

    JavaScript中对象的创建有以下几种方式: (1)使用内置对象 (2)使用JSON符号 (3)自定义对象构造 一、使用内置对象 JavaScript可用的内置对象可分为两种: 1,JavaScript语言原生对象(语言级对象),如String、...

    javascript工厂模式和构造函数模式创建对象方法解析.docx

    javascript工厂模式和构造函数模式创建对象方法解析.docx

    JavaScript面向对象程序设计创建对象的方法分析

    面向对象的语言具有一个共同的标志,那就是具有“类”的概念,但是在javascript中没有类的概念,在js中将对象定义为“无序属性的集合,其属性可以包含基本值,对象或者函数”,即其将对象看作是一组名值对的散列表。...

    JavaScript面向对象程序设计中对象的定义和继承详解

    本文实例讲述了JavaScript面向对象程序设计中对象的定义和...1.Javascript对象的定义采用混合方式【构造函数 +原型方式(prototype)】 (1)通过构造函数方式定义对象的所有非函数属性 (2)用原型方式定义对象的函数

    JavaScript原型对象、构造函数和实例对象功能与用法详解

    本文实例讲述了JavaScript原型对象、构造函数和实例对象功能与用法。分享给大家供大家参考,具体如下: 大家都知道,javascript中其实并没有类的概念。但是,用构造函数跟原型对象却可以模拟类的实现。在这里,就先...

    JavaScript中利用构造器函数模拟类的方法

    本文小编带大家一起学习的是在 JavaScript 中使用构造器函数(construcor function)模拟类。下面话不多说,感兴趣的朋友们下面来一起看看吧。 构造器函数简介 你可以使用 ES6 的 class 关键字来实现类,不过我建议...

    JavaScript中文参考手册

    本书是 JavaScript 语言的参考手册,包括核心语言中的对象和客户端、服务器端的扩展。JavaScript 是 Netscape 跨平台的基于对象的适合于客户和服务器的脚本语言。 本书已经更新于 JavaScript 1.2 的新特性,其它...

    JavaScript程序设计课件:Math对象.pptx

    在JavaScript 中的基本数值运算符可以用来进行一些简单的数学计算,而使用Math 对象可以进行更多的高级运算,如平方根、三角函数、对数和随机数等,与其他对象不同的是,该对象不是一个构造函数,不需要实例化就能...

    JavaScript对象

    JavaScript对象详细介绍: 1、Date对象 3 1.1、构造 3 1.2、属性 3 1.3、方法 3 2、Math对象 5 2.1、属性 6 2.2、方法 6 3、Number对象 7 3.1、构造 7 3.2、属性 8 3.3、方法 8 4、String对象 9 4.1、属性 9 4.2、...

    不得不看之JavaScript构造函数及new运算符

    当通过new来创建一个新对象时,JS底层将新对象的原型链指向了构造函数的原型对象,于是就在新对象和函数对象之间建立了一条原型链,通过新对象可以访问到函数对象原型prototype中的方法和属性。 和其他高级语言一样 ...

    JavaScript语言参考手册

    这些对象同时在客户端和服务器端的 JavaScript 中使用。 Array 属性 方法 Boolean 属性 方法 Date 属性 方法 Function 属性 方法 Math 属性 方法 Number 属性 方法 Object 属性 方法 String 属性 方法 RegExp 属性 ...

    深入理解javascript构造函数和原型对象

    对象,是javascript中非常重要的一个梗,是否能透彻的理解它直接关系到你对整个javascript体系的基础理解,说白了,javascript就是一群对象在搅。。(哔!)。

    编写可维护的JavaScript(中文)

    《编写可维护的JavaScript》向开发人员阐述了如何在团队开发中编写具备高可维护性的JavaScript代码,书中详细说明了作为团队一分子,应该怎么写JavaScript。本书内容涵盖了编码风格、编程技巧、自动化、测试等几方面...

    ProtectJS, 在JavaScript中,private 方法的&属性.zip

    ProtectJS, 在JavaScript中,private 方法的&属性 protectjs/保护 JS 方法/函数将 private 方法添加到JavaScript中的对象一直是一件非常困难的事情,因为JavaScript并不完全支持它。 相反,我们将函数放在构造函数中...

    JavaScript中的面向对象介绍

    对象 创建 对象 构造函数 公有、私有、特权、静态成员 this、call和apply 异常处理 继承 原型 对象 在JavaScript,可以说everything is object,那么什么是对象?对象就是包含一组变量和函数的集合。在其它面向对象...

    JavaScript权威指南(第四版)_javascript_

    《JavaScript权威指南》全面介绍了...本书还包括详细的参考手册,涵盖了JavaScript的核心API、遗留的客户端API和W3C标准DOM API,记述了这些API中的每一个JavaScript对象、方法、性质、构造函数、常量和事件处理程序。

    JavaScript程序设计课件:String对象.pptx

    这些字符型数据实际上也是构造函数String的实例,即String对象。 6.4.1 String对象 2、String对象常用属性及方法 成员 类型 作用 length 属性 获取字符串的长度 charAt(index) 方法 获取index位置的字符,位置从0...

    【JavaScript源代码】JavaScript中的几种继承方法示例.docx

    JavaScript中的几种继承方法示例  1.原型链继承  原理: 子类原型指向父类实例对象实现原型共享,即Son.prototype = new Father()。 这里先简单介绍下原型 js中每个对象都有一个__proto__属性,这个属性指向的...

    JavaScript 对象成员的可见性说明

    JavaScript对象构造的可见性定义可以分为以下几种: 1,私有属性(private properties) 通过var关键字定义对象构造中变量的作用域,该变量只能在对象构造方法的作用域内被访问。如: 代码如下: function Variable...

Global site tag (gtag.js) - Google Analytics