javascript定义类和类的实现实例详解


Posted in Javascript onDecember 01, 2015

本文实例讲述了javascript定义类和类的实现。分享给大家供大家参考,具体如下:

最近在几个群上经常看到有人问在一个类里的一个 function 怎么调用 this. 定义后公开的方法。现发一篇类实现的随笔。

首先说说类,在一个类里我们会有以下的几个特征:

1. 公有方法
2. 私有方法
3. 属性
4. 私有变量
5. 析构函数

我们直接看一个例子:

/***定义类***/
var Class = function(){
  var _self = this;//把本身引用负值到一变量上
  var _Field = "Test Field"; //私有字段
  var privateMethod = function(){ //私有方法
    alert(_self.Property); //调用属性
  }
  this.Property = "Test Property"; //公有属性
  this.Method = function(){ //公有方法
    alert(_Field); //调用私用字段
    privateMethod(); //调用私用方法
  }
}

这里我已把注释都写上,大家大概也会一眼就看得明白。对于少写JS的朋友,可能会觉得奇怪为什么我会定义一个_self的变量, 因为在js里,this不用对于其他的对象语言,他的解析过程与运行过程中this会改变的。这里简单说说js里this的定义,若有需要我可以开多一篇。

定义:this是包含它的函数作为方法被调用时所属的对象。
特征:this的环境可以随着函数被赋值给不同的对象而改变!

有兴趣的朋友可以网上找找资料了解一下,说回正题,这里的_self目的是为了开多一个私有的变量,把引用直接指向类的本身。

刚刚还说到一个析构函数的问题,这可以直接用代码来实现。在函数的最后直接写执行代码就OK。

/***定义类***/
var Class = function(){
  var _self = this;//把本身引用负值到一变量上
  var _Field = "Test Field"; //私有字段
  var privateMethod = function(){ //私有方法
    alert(_self.Property); //调用属性
  }
  this.Property = "Test Property"; //公有属性
  this.Method = function(){ //公有方法
    alert(_Field); //调用私用字段
    privateMethod(); //调用私用方法
  }
  /***析构函数***/
  var init = function(){
    privateMethod();
  }
  init();
}

使用这个类

var c = new Class();
c.Method(); //使用方法

这样就OK了

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程序设计有所帮助。

Javascript 相关文章推荐
srcElement表格样式
Sep 03 Javascript
jquery中对表单的基本操作代码
Jul 29 Javascript
3款实用的在线JS代码工具(国外)
Mar 15 Javascript
ExtJS4 动态生成的grid导出为excel示例
May 02 Javascript
jQuery带箭头提示框tooltips插件集锦
Nov 17 Javascript
javascript实现链接单选效果的方法
May 13 Javascript
Jquery和Js获得元素标签名称的方法总结
Oct 08 Javascript
基于JSONP原理解析(推荐)
Dec 04 Javascript
vue移动端UI框架实现QQ侧边菜单组件
Mar 09 Javascript
vue中实现动态生成二维码的方法
Feb 21 Javascript
antd配置config-overrides.js文件的操作
Oct 31 Javascript
面试中canvas绘制图片模糊图片问题处理
Mar 13 Javascript
深入JavaScript高级程序设计之对象、数组(栈方法,队列方法,重排序方法,迭代方法)
Dec 01 #Javascript
js跨域请求数据的3种常用的方法
Dec 01 #Javascript
jQuery插件实现多级联动菜单效果
Dec 01 #Javascript
基于Jquery实现焦点图淡出淡入效果
Nov 30 #Javascript
轻松学习jQuery插件EasyUI EasyUI创建RSS Feed阅读器
Nov 30 #Javascript
轻松学习jQuery插件EasyUI EasyUI创建树形菜单
Nov 30 #Javascript
轻松学习jQuery插件EasyUI EasyUI实现树形网络基本操作(2)
Nov 30 #Javascript
You might like
php用数组返回无限分类的列表数据的代码
2010/08/08 PHP
php批量更改数据库表前缀实现方法
2013/10/26 PHP
php+ajax实现无刷新分页的方法
2014/11/04 PHP
非常经典的PHP文件上传类分享
2016/05/15 PHP
JavaScript下利用fso判断文件是否存在的代码
2010/12/11 Javascript
Javascript 垃圾收集机制介绍理解
2013/05/14 Javascript
JS去掉第一个字符和最后一个字符的实现代码
2014/02/20 Javascript
jQuery 删除或是清空某个HTML元素示例
2014/08/04 Javascript
通过JS动态创建一个html DOM元素并显示
2014/10/15 Javascript
js简单正则验证汉字英文及下划线的方法
2016/11/28 Javascript
NodeJs安装npm包一直失败的解决方法
2017/04/28 NodeJs
jQuery实现web页面樱花坠落的特效
2017/06/01 jQuery
node 利用进程通信实现Cluster共享内存
2017/10/27 Javascript
微信小程序返回多级页面的实现方法
2017/10/27 Javascript
NodeJS服务器实现gzip压缩的示例代码
2018/10/12 NodeJs
vue项目中在外部js文件中直接调用vue实例的方法比如说this
2019/04/28 Javascript
微信小程序云开发如何实现数据库自动备份实现
2019/08/16 Javascript
vue cli3 调用百度翻译API翻译页面的实现示例
2019/09/13 Javascript
在pycharm中开发vue的方法步骤
2020/03/04 Javascript
详解在Vue.js编写更好的v-for循环的6种技巧
2020/04/14 Javascript
JavaScript闭包原理与用法学习笔记
2020/05/29 Javascript
Js on及addEventListener原理用法区别解析
2020/07/11 Javascript
python中日期和时间格式化输出的方法小结
2015/03/19 Python
Python列表解析配合if else的方法
2018/06/23 Python
解决.ui文件生成的.py文件运行不出现界面的方法
2019/06/19 Python
HTML5 与 XHTML2
2008/10/17 HTML / CSS
解析HTML5的存储功能和web SQL的相关操作方法
2016/02/19 HTML / CSS
诚实守信道德模范事迹材料
2014/08/15 职场文书
2015年国庆节慰问信
2015/03/23 职场文书
运动会加油稿
2015/07/22 职场文书
《少年闰土》教学反思
2016/02/18 职场文书
公司开业的祝贺语大全(60条)
2019/07/05 职场文书
2019年最新七夕唯美祝福语(60条)
2019/07/22 职场文书
Python按顺序遍历并读取文件夹中文件
2022/04/29 Python
多线程Spring通过@Scheduled实现定时任务
2022/05/25 Java/Android
MySQL索引失效十种场景与优化方案
2023/05/08 MySQL