`

Javascript中的类实现

    博客分类:
  • Ajax
阅读更多
Javascript本身并不支持面向对象,它没有访问控制符,它没有定义类的关键字class,它没有支持继承的extend或冒号,它也没有用来支持虚函数的virtual,不过,Javascript是一门灵活的语言,下面我们就看看没有关键字class的Javascript如何实现类定义,并创建对象。

一:定义类并创建类的实例对象
在Javascript中,我们用function来定义类,如下:

function Shape()
{
    var x=1;
    var y=2;
}

你或许会说,疑?这个不是定义函数吗?没错,这个是定义函数,我们定义了一个Shape函数,并对x和y进行了初始化。不过,如果你换个角度来看,这个就是定义一个Shape类,里面有两个属性x和y,初始值分别是1和2,只不过,我们定义类的关键字是function而不是class。

然后,我们可以创建Shape类的对象aShape,如下:

var aShape = new Shape();


二:定义公有属性和私有属性
我们已经创建了aShape对象,但是,当我们试着访问它的属性时,会出错,如下:
aShape.x=1;

这说明,用var定义的属性是私有的。我们需要使用this关键字来定义公有的属性
function Shape()
{
    this.x=1;
    this.y=2;
}

这样,我们就可以访问Shape的属性了,如。
aShape.x=2;

好,我们可以根据上面的代码总结得到:用var可以定义类的private属性,而用this能定义类的public属性。

三:定义公有方法和私有方法

在Javascript中,函数是Function类的实例,Function间接继承自Object,所以,函数也是一个对象,因此,我们可以用赋值的方法创建函数,当然,我们也可以将一个函数赋给类的一个属性变量,那么,这个属性变量就可以称为方法,因为它是一个可以执行的函数。代码如下:

function Shape()
{
    var x=0;
    var y=1;
    this.draw=function()
    {
        //print;
    };
}

我们在上面的代码中定义了一个draw,并把一个function赋给它,下面,我们就可以通过aShape调用这个函数,OOP中称为公有方法,如:
aShape.draw();

如果用var定义,那么这个draw就变成私有的了,OOP中称为私有方法,如
function Shape()
{
    var x=0;
    var y=1;
    var draw=function()
    {
        //print;
    };
}
这样就不能使用aShape.draw调用这个函数了。



三:构造函数
Javascript并不支持OOP,当然也就没有构造函数了,不过,我们可以自己模拟一个构造函数,让对象被创建时自动调用,代码如下:
function Shape()
{
    var init = function()
    {
         //构造函数代码
    };

    init();
}

在Shape的最后,我们人为的调用了init函数,那么,在创建了一个Shape对象是,init总会被自动调用,可以模拟我们的构造函数了。


四:带参数的构造函数
如何让构造函数带参数呢?其实很简单,将要传入的参数写入函数的参数列表中即可,如

function Shape(ax,ay)
{
    var x=0;
    var y=0;
    var init = function()
    {
        //构造函数
        x=ax;
        y=ay;
    };

    init();
}


这样,我们就可以这样创建对象:
var aShape = new Shape(0,1);


五:静态属性和静态方法
在Javascript中如何定义静态的属性和方法呢?如下所示

function Shape(ax,ay)
{
    var x=0;
    var y=0;
    var init = function()
    {
        //构造函数
        x=ax;
        y=ay;
    };

    init();
}
Shape.count=0;//定义一个静态属性count,这个属性是属于类的,不是属于对象的。
Shape.staticMethod=function(){};//定义一个静态的方法

有了静态属性和方法,我们就可以用类名来访问它了,如下
alert ( aShape.count );
aShape.staticMethod();
注意:静态属性和方法都是公有的,目前为止,我不知道如何让静态属性和方法变成私有的~



六:在方法中访问本类的公有属性和私有属性

在类的方法中访问自己的属性,Javascript对于公有属性和私有属性的访问方法有所不同,请大家看下面的代码
function Shape(ax,ay)
{
    var x=0;
    var y=0;
    this.gx=0;
    this.gy=0;
    var init = function()
    {
        x=ax;//访问私有属性,直接写变量名即可
        y=ay;
        this.gx=ax;//访问公有属性,需要在变量名前加上this.
        this.gy=ay;
    };

    init();
}

七:this的注意事项
根据笔者的经验,类中的this并不是一直指向我们的这个对象本身的,主要原因还是因为Javascript并不是OOP语言,而且,函数和类均用function定义,当然会引起一些小问题。
this指针指错的场合一般在事件处理上面,我们想让某个对象的成员函数来响应某个事件,当事件被触发以后,系统会调用我们这个成员函数,但是,传入的this指针已经不是我们本身的对象了,当然,这时再在成员函数中调用this当然会出错了。
解决方法是我们在定义类的一开始就将this保存到一个私有的属性中,以后,我们可以用这个属性代替this。我用这个方法使用this指针相当安全,而且很是省心~
我们修改一下代码,解决this问题。对照第六部分的代码看,你一定就明白了
function Shape(ax,ay)
{
    var _this=this; //把this保存下来,以后用_this代替this,这样就不会被this弄晕了
    var x=0;
    var y=0;
    _this.gx=0;
    _this.gy=0;
    var init = function()
    {
        x=ax;//访问私有属性,直接写变量名即可
        y=ay;
        _this.gx=ax;//访问公有属性,需要在变量名前加上this.
        _this.gy=ay;
    };

    init();
}


以上我们聊了如何在Javascript中定义类,创建类的对象,创建公有和私有的属性和方法,创建静态属性和方法,模拟构造函数,并且讨论了容易出错的this。
关于Javascript中的OOP实现就聊到这里,以上是最实用的内容,一般用Javascript定义类,创建对象用以上的代码已经足够了。当然,你还可以用mootools或prototype来定义类,创建对象。我用过mootools框架,感觉很不错,它对Javascript的类模拟就更完善了,还支持类的继承,有兴趣的读者可以去尝试一下。当然,如果使用了框架,那么在你的网页中就需要包含相关的js头文件,因此我还是希望读者能够在没有框架的情况下创建类,这样,代码效率较高,而且你也可以看到,要创建一个简单的类并不麻烦~
在下一个版本的Javascript中,将会加入对OOP的支持,届时,我们将看到class关键字,public、private访问控制符~extend继承。如果大家对下一代Javascript感兴趣,不妨可以先接触一下ActionScript3.0,这是一门相当先进的脚本语言,是Adobe收购Macromedia后的一个力作,它和Javascript一样,都属于ECMAScript,只不过AS3.0是ECMAScript的第4版的实现。要学习ActionScript3.0,我重点推荐孙颖老师的《ActionScript3殿堂之路》,这本书写的绝对好,特别是面向对象这部分,写的特别通俗易懂,例子生动,读完以后感觉很有收获,在赞叹新版的ECMAScript的同时,也给了我极大的动力继续深入学习OOP编程思想,有兴趣的读者不妨去品读一下~

分享到:
评论

相关推荐

    在JavaScript中实现类的方式探讨

    在JavaScript中实现类的方式主要有几种,包括对象字面量(Object Literal)、构造函数(Constructor)、原型链(Prototype Chain)以及ES6引入的类语法。每种方式都有其适用的场景和特点,理解它们有助于我们更好地...

    javascript 原生态js类继承实现的方式

    而实例则是类的一个具体实现。 我们还知道,面向对象编程有三个重要的概念 - 封装、继承和多态。 但是在JavaScript的世界中,所有的这一切特性似乎都不存在。 因为JavaScript本身不是面向对象的语言,而是基于对象...

    JavaScript 实现基础 LinkedList 功能

    在JavaScript中实现LinkedList,我们需要理解其基本概念、操作以及如何用原生JavaScript对象来模拟链表结构。 首先,LinkedList由一系列节点(Node)组成,每个节点包含两部分:数据和指向下一个节点的引用。在...

    javascript中的类理解

    在 JavaScript 中,类的概念是在 ECMAScript 6(ES6)版本引入的,之前 JavaScript 使用构造函数和原型链来实现面向对象编程。下面我们将深入探讨 JavaScript 中的类。 1. **类的定义** 在 JavaScript 中,类的...

    javascript实现的一些网页特效

    在本文中,我们将深入探讨如何使用JavaScript实现各种网页特效,以提升用户体验并使网站更具吸引力。 1. **页面加载动画** 当用户访问网页时,加载动画可以提供视觉反馈,表明页面正在加载。JavaScript可以通过...

    javaScript实现另存为功能

    然后,将这些内容转换为Blob对象,Blob是JavaScript中的一个类,用于表示不可变的、原始数据的类文件对象。 2. **URL.createObjectURL()**:有了Blob对象后,可以使用URL.createObjectURL()方法生成一个临时的URL,...

    javascript 实现排序分类功能

    javascript 实现排序分类功能, 冒泡排序, 快速排序等等

    Javascript 类和对象的实现

    `prototype` 是 JavaScript 类实现的关键。通过在构造函数的 `prototype` 属性上定义方法,可以确保这些方法被所有实例共享。此外,`prototype` 还支持继承机制,允许子类继承父类的属性和方法: ```javascript ...

    web期末大作业 基于HTML+CSS+JavaScript实现的生活类购物商城首页源码

    web期末大作业 基于HTML+CSS+JavaScript实现的生活类购物商城首页源码 web期末大作业 基于HTML+CSS+JavaScript实现的生活类购物商城首页源码 web期末大作业 基于HTML+CSS+JavaScript实现的生活类购物商城首页源码 ...

    IOS WebView与JavaScript交互实现Web App

    本篇文章将深入探讨如何在iOS中使用`UIWebView`加载bundle内的HTML文件,并实现WebView与JavaScript的交互。 首先,我们需要了解`UIWebView`的基本用法。`UIWebView`是一个视图类,可以显示和加载网页内容。我们...

    web期末大作业 基于HTML+CSS+JavaScript实现的农业类水果商城首页源码

    web期末大作业 基于HTML+CSS+JavaScript实现的农业类水果商城首页源码 web期末大作业 基于HTML+CSS+JavaScript实现的农业类水果商城首页源码 web期末大作业 基于HTML+CSS+JavaScript实现的农业类水果商城首页源码 ...

    javascript 实现IP地址的检测分类

    带注释,可运行,代码一看就懂。运行简单!希望支持 。所有者shine

    asp.net中javascript通用类

    通过这样的通用JavaScript类,开发者可以创建出更健壮、可维护的ASP.NET应用,同时提高开发效率。不过,随着技术的发展,现代Web开发中更多地倾向于使用库和框架(如jQuery、React、Vue等),它们提供了更高级别的...

    Android WebView与JavaScript交互实现Web App

    在这个主题中,我们将深入探讨如何在Android中加载assets目录下的HTML文件,并通过WebView实现与JavaScript的交互。 首先,我们要了解`WebView`的基本用法。在Android布局文件中,我们添加一个WebView组件: ```...

    web期末大作业 基于HTML+CSS+JavaScript实现的电商类化妆品购物商城首页源码

    web期末大作业 基于HTML+CSS+JavaScript实现的电商类化妆品购物商城首页源码 web期末大作业 基于HTML+CSS+JavaScript实现的电商类化妆品购物商城首页源码 web期末大作业 基于HTML+CSS+JavaScript实现的电商类化妆品...

    QT和网页中的JavaScript函数进行相互调用的实现

    通过以上步骤,你可以实现在QT应用中与网页的JavaScript函数的双向调用,从而充分利用两者的优点,打造功能丰富的桌面应用。这个IntelliPlugin可能是一个帮助开发者实现上述功能的插件,包含必要的示例代码和配置...

    web期末大作业 基于HTML+CSS+JavaScript实现的生活类购物商城网站源码(10页)

    web期末大作业 基于HTML+CSS+JavaScript实现的生活类购物商城网站源码(10页) web期末大作业 基于HTML+CSS+JavaScript实现的生活类购物商城网站源码(10页) web期末大作业 基于HTML+CSS+JavaScript实现的生活类购物...

    web期末大作业 基于HTML+CSS+JavaScript实现的折扣类电子商务商城源码(5页)

    web期末大作业 基于HTML+CSS+JavaScript实现的折扣类电子商务商城源码(5页) web期末大作业 基于HTML+CSS+JavaScript实现的折扣类电子商务商城源码(5页) web期末大作业 基于HTML+CSS+JavaScript实现的折扣类电子商务...

    web期末大作业 基于HTML+CSS+JavaScript实现的服装类电子商务商城源码(4页)

    web期末大作业 基于HTML+CSS+JavaScript实现的服装类电子商务商城源码(4页) web期末大作业 基于HTML+CSS+JavaScript实现的服装类电子商务商城源码(4页) web期末大作业 基于HTML+CSS+JavaScript实现的服装类电子商务...

Global site tag (gtag.js) - Google Analytics