JS面向对象编程浅析


Posted in Javascript onAugust 28, 2011

在AJAX兴起以前,很多人写JS可以说都是毫无章法可言的,基本上是想到什么就写什么,就是一个接一个的函数function,遇到重复的还得copy,如果一不小心函数重名了,还真不知道从何开始查找错误,因为大家总是用面向过程的编程思想来写JS代码,而且也由于网络上充斥了太多小“巧”的JS代码段,很多都是随意而为,很不规范,这也就造成了大家对JS的“误解”,一味的认为它就是一个辅助的小东东,而不适合做大的东西开发。但是自从AJAX兴起后,大量的JS代码编写要求人们具备像写JAVA类似的代码一样,能够面向对象进行开发。

所以下面就结合我自己的体会和所学习的东东和大家一起来学习在JS中如何使用面向对象的编程。其实使用JS进行面向对象开发也不是很难的事情,因为在JS中每一个function就是一个对象,比如如下一个函数:

function HelloWorld() 
{ 
alert('hello world!'); 
}

那么我们在使用的时候就可以把它当成一个对象来使用,比如使用如下的测试函数:
function _test() 
{ 
var obj = new HelloWorld(); 
}

那么在调用_test方法后就会弹出hello world!的提示框,也就是调用了HelloWorld()对象(函数)。在这里HelloWorld这个对象没有任何属性和方法,它只有一个构造方法HelloWorld(),我们可以把它想象成JAVA中的一个没有任何属性和方法的类,当使用new进行对象创建的时候,就调用了它的构造方法。这也是我们最简单的对象了,当然了,一个对象肯定是要赋予它属性和方法的,在JS中我们使用prototype原型关键字进行赋值,比如我要给HelloWorld对象增加一个sayHello方法和一个name属性,那么就可以这样添加:
HelloWorld.prototype = { 
name : 'JavaScript', 
sayHello : function() { 
alert(this.name); 
} 
}

那么就可以为HelloWorld添加了一个name属性和sayHello方法,我们再改一下_test方法,如下:
function _test() 
{ 
var obj = new HelloWorld(); 
obj.sayHello(); 
}

那么调用_test方法后就会先后打印hello wordl!和JavaScript(一个是构造方法中的alert,一个是sayHello方法中的alert)。注意sayHello方法中的alert引用了this关键字,该关键字表示的就是HelloWorld对象,即默认指向该对象,和JAVA中的this关键字一样。

对于向一个对象添加实例方法和属性,我们可以采用上述的方式,即使用prototype关键字进行赋值,格式如下:

对象名称.prototype = { 
属性一 : 属性值, 
属性二 : 属性值, 
方法一 : function(参数列表) { 
方法体; 
}, 
方法二 : function(参数列表) { 
方法体; 
} 
}

可以按照如上方式对一个对象进行多个属性和方法的定义,这样在new一个对象后,就可以使用实例名称.属性或方法来获取属性或执行方法了。

在上面的方法中,大家不知道发现没有对象的属性是可以直接访问的,比如访问HelloWorld对象的name属性就可以使用obj.name直接获取。这就好比我们JAVA中的公有属性了,而且我们还可以直接对name属性进行赋值操作。所以现在有一个问题了,我们如何给一个对象赋一个私有成员变量呢?那我们就可能要改一下HelloWorld类的声明方式了,不使用prototype进行类的属性和方法声明,而是直接使用内嵌函数和属性进行声明,修改的HelloWorld如下,我们命名为HelloWorld2:

function HelloWorld2() 
{ 
var privateProp = 'hello world 2!'; 
this.method = function() { 
alert(privateProp); 
} 
}

看到HelloWorld2的类申明方式了没?是直接在函数内部进行了函数嵌套申明,而且我们还设置了一个局部变量privateProp,即我们的私有成员变量,该变量只能被HelloWorld2内部的函数进行访问,外部访问是不允许的,这样我们就可以通过使用变量的作用域来巧妙的设置类的私有变量了。我们应用如下:
function _test2() 
{ 
var obj2 = new HelloWorld2(); 
obj2.method(); // 调用该方法将打印'hello world 2! 
alert(obj2.privateProp); // 将打印undefined 
}

上面所说的都是如何定义一个类,以为如何为一个类定义属性和方法,由于采用prototype方式进行定义清晰明了,所以一般都是使用该方式进行类的定义,而且现在很多AJAX框架中都使用了类似的类声明方式。而且类的私有成员变量却只能在类的构造方式中的函数进行访问,这样类的prototype声明的方法就不能访问该私有成员变量了,而且可读性方面也没有prototype方式好。

好了,上面所说的都是定义一个类的实例方法和属性。在JAVA中类有实例方法和属性与类方法和属性之分。所谓类属性和方法就是该类的所有实例都只维护一份类属性和类方法的副本,而不是每个实例都维护一套,这和实例属性和实例方法是不一样的。那么在JS中如何为一个类定义静态类方法和类属性呢?我们可以直接为类添加静态属性和静态方法,比如为HelloWorld类添加一个age的静态属性和一个hello的静态方法,那么声明如下:

HelloWorld.age = 22; 
HelloWorld.hello = function() { 
alert(HelloWorld.age); 
}

那么这样就为类HelloWorld声明了静态属性age和静态方法hello了。在使用的时候就直接使用类名进行访问了,但是不能使用实例进行访问,这点与JAVA中的是一致的,测试如下:
function _test() 
{ 
var obj = new HelloWorld(); 
obj.sayHello(); // 正确,实例方法,可以通过实例进行访问 
HelloWorld.hello(); // 正确,静态方法,通过类名进行直接访问 
obj.hello(); // 错误,不能通过实例访问静态方法。会报JS错误! 
}

通过以上的说明,相信大家对JS进行面向对象编程有了一定的了解,而且也一定蠢蠢欲动了吧,呵呵,大家不妨试试(提示:以上代码全部通过测试!)
Javascript 相关文章推荐
取得传值的函数
Oct 27 Javascript
js函数的延迟加载实现代码
Oct 11 Javascript
基于jquery实现select选择框内容左右移动添加删除代码分享
Aug 25 Javascript
jQuery技巧之让任何组件都支持类似DOM的事件管理
Apr 05 Javascript
JavaScript实现前端实时搜索功能
Mar 26 Javascript
Vue.js学习笔记之修饰符详解
Jul 25 Javascript
vuejs+element-ui+laravel5.4上传文件的示例代码
Aug 12 Javascript
关于JavaScript的单双引号嵌套问题
Aug 20 Javascript
使用ef6创建oracle数据库的实体模型遇到的问题及解决方案
Nov 09 Javascript
解决vue-cli + webpack 新建项目出错的问题
Mar 20 Javascript
Vue实现textarea固定输入行数与添加下划线样式的思路详解
Jun 28 Javascript
基于redis的小程序登录实现方法流程分析
May 25 Javascript
用JS实现一个TreeMenu效果分享
Aug 28 #Javascript
JS target与currentTarget区别说明
Aug 28 #Javascript
IE6,IE7,IE8下使用Javascript记录光标选中范围(已补全)
Aug 28 #Javascript
range 标准化之获取
Aug 28 #Javascript
dojo学习第一天 Tab选项卡 实现
Aug 28 #Javascript
js中设置元素class的三种方法小结
Aug 28 #Javascript
IE6、IE7中setAttribute不支持class/for/rowspan/colspan等属性
Aug 28 #Javascript
You might like
修改php.ini实现Mysql导入数据库文件最大限制的修改方法
2007/12/11 PHP
discuz7 phpMysql操作类
2009/06/21 PHP
PHP取整函数:ceil,floor,round,intval的区别详细解析
2013/08/31 PHP
php常用字符串处理函数实例分析
2014/11/22 PHP
PHP正则删除HTML代码中宽高样式的方法
2017/06/12 PHP
PHP集成环境XAMPP的安装与配置
2018/11/13 PHP
Javascript将string类型转换int类型
2010/12/09 Javascript
jquery中使用ajax获取远程页面信息
2011/11/13 Javascript
jquery中通过父级查找进行定位示例
2013/06/28 Javascript
jQuery实现Div拖动+键盘控制综合效果的方法
2015/03/10 Javascript
JS使用oumousemove和oumouseout动态改变图片显示的方法
2015/03/31 Javascript
JavaScript中的跨浏览器事件操作的基本方法整理
2016/05/20 Javascript
js阻止冒泡和默认事件(默认行为)详解
2016/10/20 Javascript
jQuery中的deferred对象和extend方法详解
2017/05/08 jQuery
Angular 2父子组件数据传递之@ViewChild获取子组件详解
2017/07/04 Javascript
JavaScript插件Tab选项卡效果
2017/11/14 Javascript
vue-cli脚手架搭建的项目去除eslint验证的方法
2018/09/29 Javascript
vue实现点击追加选中样式效果
2019/11/01 Javascript
vue-cli3项目升级到vue-cli4 的方法总结
2020/03/19 Javascript
关于vue 结合原生js 解决echarts resize问题
2020/07/26 Javascript
Python对象体系深入分析
2014/10/28 Python
Python用61行代码实现图片像素化的示例代码
2018/12/10 Python
python图形工具turtle绘制国际象棋棋盘
2019/05/23 Python
Python API 自动化实战详解(纯代码)
2019/06/11 Python
python 实现保存最新的三份文件,其余的都删掉
2019/12/22 Python
Python的形参和实参使用方式
2019/12/24 Python
Python 存取npy格式数据实例
2020/07/01 Python
苹果美国官方商城:Apple美国
2016/08/24 全球购物
Expedia瑞典官网:预订度假屋、酒店、汽车租赁、机票等
2021/01/23 全球购物
北京华建集团SQL面试题
2014/06/03 面试题
.net开发工程师面试题
2014/02/25 面试题
幼儿园保育员岗位职责
2014/04/13 职场文书
2014乡党委副书记党建工作汇报材料
2014/11/02 职场文书
详解Go语言Slice作为函数参数的使用
2021/07/02 Golang
详解jQuery的核心函数和事件处理
2022/02/18 jQuery
ubuntu端向日葵键盘输入卡顿问题及解决
2022/12/24 Servers