`
tellixu
  • 浏览: 68073 次
最近访客 更多访客>>
社区版块
存档分类
最新评论

javaScript面向对象之定义类

阅读更多
    提起面向对象我们就能想到类,对象,封装,继承,多态,目前的javaScript资料中对这部分描述总是感觉不进人意,看了付老师的博客,感觉描述的有点少,在《javaScript高级程序设计》(人民邮电出版社,曹力、张欣译。英文名字是:Professional JavaScript for Web Developers)这本书中描述的还算比较详细。我们看看JavaScript中定义类的各种方法。

1.工厂方式

    javaScript中创建自己的类和对象,我们应该是必须掌握的,我们都知道javaScript中对象的属性可以在对象创建后动态定义,比如下面的代码:

<SCRIPT LANGUAGE="JavaScript">

    //定义

    var oCar=new Object();

    oCar.color="red";

    oCar.doors=4;

    oCar.showColor=function()

    {

        alert(this.color);

    }

    //调用

    oCar.showColor();

</SCRIPT>

    我们很容易使用oCar对象,但是我们创就是想创建多个Car实例。我们可以使用一个函数来封装上面的代码来实现:

<SCRIPT LANGUAGE="JavaScript">

//定义

   function createCar()

  {

     var oCar=new Object();

     oCar.color="red";

     oCar.doors=4;

     oCar.showColor=function()

     {

         alert(this.color);

     }

     return oCar;

  }

    //调用

    var ocar1=createCar();

    var ocar2=createCar();

    ocar1.color="black";

    ocar1.showColor();

    ocar2.showColor();

</SCRIPT>

    顺便说一下,javaScript对象默认成员属性都是public 的。这种方式我们称为工厂方式,我们创造了能创建并返回特定类型的对象的工厂。

    这样做有点意思了,但是在面向对象中我们经常使用创建对象的方法是:

Car car=new Car();

    使用new 关键字已经深入人心,因此我们使用上面的方法去定义总感觉别扭,并且每次调用时都去创建新的属性以及函数,功能上也不实际。下来我们看看构造函数的形式定义类。

2.构造函数

这种方式看起来有点象工厂函数。具体表现如下:

<SCRIPT LANGUAGE="JavaScript">

//定义

    function Car(color,doors)

    {

        this.color=color;

        this.doors=doors;

        this.showColor=function()

        {

            alert(this.color);

        };

    }

    //调用

    var car1=new Car("red",4);

    var car2=new Car("blue",4);

    car1.showColor();

    car2.showColor();

</SCRIPT>

    看起来效果很明显,有差别了吧。感觉有点意思了。在构造函数内部创造对象使用this 关键字,使用new 运算符创建对象感觉非常亲切。但是也有点问题:每次new 对象时都会创建所有的属性,包括函数的创建,也就是说多个对象完全独立,我们定义类的目的就是为了共享方法以及数据,但是car1对象与car2对象都是各自独立的属性与函数,最起码我们应该共享方法。这就是原形方式的优势所在。

3.原型方式

利用对象的prototype属性,可把它看出创建新对象所依赖的原型。方法如下:

<SCRIPT LANGUAGE="JavaScript">

//定义

     function Car(){

     };

     Car.prototype.color="red";

     Car.prototype.doors=4;

     Car.prototype.drivers=new Array("Tom","Jerry");

     Car.prototype.showColor=function(){

        alert(this.color);

    }

    //调用:

    var car1=new Car();

    var car2=new Car();

    car1.showColor();

    car2.showColor();

    alert(car1.drivers);

    car1.drivers.push("stephen");

    alert(car1.drivers); //结果:Tom,Jerry,stephen

    alert(car2.drivers); //结果:Tom,Jerry,stephen

</SCRIPT>

    首先这段代码的构造函数,其中没有任何代码,接下来通过对象的prototype属性添加属性定义Car对象的属性。这种方法很好,但是问题是Car的对象指向的是Array指针,Car的两个对象都指向同一个Array数组,其中一个对象car1改变属性对象的引用(数组Array)时,另一个对象car2也同时改变,这是不允许的。

    同时该问题也表现在原型不能带任何初始化参数,导致构造函数无法正常初始化。这需要另一种方式来解决:那就是混合的构造函数/原型模式。

4. 混合的构造函数/原型模式

联合使用构造函数和原型方式,定义类就非常方便。

<SCRIPT LANGUAGE="JavaScript">

//定义

    function Car(color,doors)

   {

        this.color=color;

        this.doors=doors;

        this.drivers=new Array("Tom","Jerry");

   }

   Car.prototype.showColor=function(){

        alert(this.color);

   }

   //调用:

   var car1=new Car(“red”,4);

   var car2=new Car(“blue”,4);

   car1.showColor();

   car2.showColor();

   alert(car1.drivers);

   car1.drivers.push("stephen");

   alert(car1.drivers); //结果:Tom,Jerry,stephen

   alert(car2.drivers); //结果:Tom,Jerry

   alert(car1 instanceof Car);

</SCRIPT>

    该方法是把属性放在内部定义,把方法放在外边利用prototype进行定义。解决了第三种方法的问题。

    这种方法其实应该来说非常友好了,但是比起java的语法来,应该有一些不和谐,感觉比较凌乱,对C++来说,我们就没有那么麻烦的感觉了,可是开发C++的研发人员一般情况下很少涉及javaScript,而对J2EE的研发人员来说,这种方式总有一些别扭。总感觉不是友好的封装,其实只不过是视觉上封装效果不是很好而已,要想达到视觉封装效果而又能达到这种方法的效果的也可以以,个人认为其实比较麻烦。那就是动态原型法。

5.动态原型

这个方法需要检查对象定义的某一个动态属性如(_initialized)属性是否等于undefined,如果构造函数没有被调用则_initialized未定义,否则结束时定义为true即可,实现方法是:

<SCRIPT LANGUAGE="JavaScript">

//定义

    function Car()

    {

        this.color="red";

        this.doors=4;

        this.drivers=new Array("Tom","Jerry");

    if (typeof Car._initialized == "undefined")

    {

        Car.prototype.showColor=function()

       {

            alert(this.color);

       }

       //............

    }

    //最后定义

    Car._initialized=true;

}

</SCRIPT>

    这种方法虽然在视觉上达到了封装,但是感觉总是别扭的,但是据说业界也很流行。我更喜欢看中第四种方法来定义类。
 
分享到:
评论

相关推荐

    JavaScript面向对象的支持

    ES6引入了类的语法糖,使得JavaScript的面向对象编程看起来更接近传统的类式继承。但实质上,这些类仍然基于原型继承,提供了更方便的构造函数、原型链管理和继承机制。 8. **模块系统**: ES6的`import`和`...

    JavaScript 面向对象编程

    ### JavaScript面向对象编程详解 #### 一、JavaScript面向对象编程简介 JavaScript作为一种广泛使用的脚本语言,虽然起源于一种简单的浏览器脚本环境,但随着时间的发展,它已经演变为一种功能强大的编程语言,...

    JavaScript面向对象编程

    ### JavaScript面向对象编程详解 #### 一、面向对象的基本概念 面向对象编程(Object-Oriented Programming, OOP)是一种程序设计范式,其核心思想是将数据与处理这些数据的方法封装在一起,形成一个个对象。在...

    javascript面向对象编程

    此外,ES6引入了类的概念和类式继承,提供了一种更接近传统面向对象语言的继承方式。 4. **多态**:JavaScript通过函数的动态绑定和方法重写实现多态,允许不同对象对同一消息作出不同的响应。 5. **构造函数和...

    javascript 面向对象基础

    在本文中,我们将深入探讨 JavaScript 的面向对象基础,主要包括类的定义、实例化以及对象属性和方法的引用。 首先,让我们了解如何在 JavaScript 中定义一个类。在 JavaScript 中,类通常通过函数来实现。例如,...

    JavaScript的面向对象特性浅析与范例.pdf

    "JavaScript面向对象特性浅析与范例" JavaScript是一种基于原型的解释型语言,它允许在任意时刻给一个对象添加任意多的属性和方法。 JavaScript的面向对象特性是指它可以实现面向对象编程的部分特性,而不是完全...

    javascript面向对象之对象的深入理解.docx

    ### JavaScript面向对象之对象的深入理解 #### 一、引言 在JavaScript中,对象是其核心组成部分之一,几乎所有的操作都是围绕着对象来进行的。本文将深入探讨JavaScript中的对象概念,通过具体示例帮助读者更好地...

    JavaScript语言与Ajax应用JavaScript面向对象编程.pptx

    自定义对象是JavaScript面向对象编程的核心,可以通过构造函数或原型链来实现: - 构造函数方式:定义一个函数作为构造器,使用new关键字创建实例。 ```javascript function Person(name, age) { this.name = name...

    javascript面向对象的编程.docx

    JavaScript 面向对象编程是该语言的核心特性之一,它允许开发者通过对象和它们的属性、...这就是JavaScript面向对象编程的基本应用。通过掌握这些知识,开发者能够更好地驾驭JavaScript,构建出高效、灵活的前端应用。

    javaScript面向对象PPT课件.ppt

    JavaScript是一种基于原型的面向对象编程语言,这意味着在JavaScript中,所有数据类型,包括基本类型,都可以被视为对象。在JavaScript中,对象是属性和方法的集合,它们可以通过键(key)来访问这些属性和方法。...

    JavaScript中支持面向对象的基础

    在JavaScript中,面向对象编程是一种重要的编程范式,它允许我们通过类和对象来组织和管理代码。在JavaScript中,面向对象主要基于以下三个核心概念:构造函数、原型和实例。 首先,我们要理解如何在JavaScript中...

    js面向对象.pdf

    ### JavaScript面向对象编程详解 #### 6.1 JavaScript中支持面向对象的基础 ##### 6.1.1 使用定义函数的方式定义类 在面向对象编程(OOP)中,“类”是核心概念之一,它代表着一类事物的抽象。在JavaScript中,可以...

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

    本文实例讲述了JavaScript面向对象程序设计创建对象的方法。分享给大家供大家参考,具体如下: 面向对象的语言具有一个共同的标志,那就是具有“类”的概念,但是在javascript中没有类的概念,在js中将对象定义为...

    javascript 面向对象编程基础:封装

    首先,要讨论javascript中的面向对象编程,必须先理解什么是“类”。...随着Ajax等技术的广泛应用,JavaScript面向对象的特性变得越来越重要,这促使***ript开发者必须更加深入地了解并应用这些面向对象的概念。

    JavaScript面向对象精要(下部)

    JavaScript面向对象编程是该语言的核心特性之一,它让开发者可以使用对象、继承、多态等面向对象编程概念来组织代码。本文针对JavaScript面向对象的下部内容,提供了深入解析。 首先,我们了解构造函数...

    面向对象的JavaScript基础

    2. **类(Class)**:虽然JavaScript原生不支持类,但在ES6中引入了类语法糖,使得代码更符合传统的面向对象风格。类本质上仍然是函数,但提供了更易读的结构。例如: ```javascript class Person { constructor...

Global site tag (gtag.js) - Google Analytics