JavaScript面向对象程序设计:对象成员定义详解
本文深入解析JavaScript中面向对象设计的对象成员定义。详细阐述公有成员、公有方法的创建,利用闭包实现私有成员与私有方法,以及通过函数作用域和原型概念定义静态变量、静态函数和常量的具体技巧与代码示例。
JavaScript对象成员定义概述
本文通过具体实例,详细解析了JavaScript面向对象程序中对象成员的定义方式,供读者参考学习。
前言:
初学JavaScript时,常因缺乏规范、手册匮乏以及与HTML、DOM、CSS交互复杂而感到困惑,觉得代码可读性差。起初仅能勉强理解面向过程的代码,面对面向对象代码时更是感到困难重重。随着对Ajax和jQuery的了解,以及发现大量网页特效由JavaScript编写,逐渐对其产生好感。在从事JavaScript与PHP混合开发后,深刻体会到JavaScript的强大与灵活。阅读《JavaScript权威指南》和《JavaScript高级编程》后,认识到正是这种灵活性造就了其独特价值。本文旨在记录学习心得,加深理解并分享给同行。
公有成员与构造函数的定义
1. 公有成员
在JavaScript中,万物皆对象,因此定义一个对象及其公有成员非常简单。
var obj = {
aa:"I'm public"
}
然而,上述对象仅是一个空壳。在Java或C++/C#等语言中,对象通常包含构造函数。如何在定义对象的同时定义其构造函数?在Java/C++中,构造函数是对象的一个成员函数,但在JavaScript中需要转换思维。如果仅定义构造函数:
var obj = {
aa:"I'm public",
_construct:function(){
}
}
当使用new关键字创建该对象时,构造函数并不会“自动”执行。基于“万物皆对象”的理念,如何让一个对象在定义时执行特定函数?答案是定义一个函数对象。
var obj = function(mem1){
this.aa = mem1;
};
这样,我们就定义了一个具备“构造函数”特性的对象。
公有方法的实现
2. 公有方法
定义公有方法与定义公有成员的方式相同,区别在于该成员是一个函数,而非字符串或其他类型的对象。
var obj = fucntion(mem1){
this.a = mem1;
this.getA = function(){
return this.a;
}
};
利用闭包实现私有成员与方法
3. 私有成员和私有方法
我们知道虽然javascript中有对象的概念,但是却没有“私有”的概念,也就是说我们不能像java/C++一样使用关键词private来定义一个私有成员,只要是成员,就是公有的,那么怎么实现私有成员呢?我们首先考虑这个问题:什么叫私有成员?私有成员就是在对象的外部不能直接访问的成员,比如对象obj,如果我们能直接引用obj.a那么他就是公有的,如果引用obj._b,提示错误或者抛出异常,那么_b就是私有的。实现私有成员也就是实现在类的外部不能访问他的某种成员,而只能通过他的成员函数访问。在1中已经说了,我们现在定义的是函数对象,那么也就是说要实现在函数的外部不能访问他的某种成员,而只能通过他的成员函数访问。函数的成员函数这叫什么话?我们换一种说法:函数内部定义的函数。那么我们要实现的就是在函数的外部不能访问,但是在函数内部定义的函数能访问的某种变量,如果了解javascript特性的开发人员,应该对黑体的这句话感觉似曾相识,没错,这就是闭包的概念。
闭包概念复杂,此处不展开,可视为专题讨论,建议参考《JavaScript高级编程》或相关资料。
基于上述思路,可对对象定义进行改造。
var obj = function(){
//private member
var _b;
//public member
this.a = mem1;
//constructor
_b = mem2;
//private method definations
function _getB(){return _b};
//public method definations
this.getA = function(){return this.a;};
this.getB = function(){return _getB();};
this.setA = fucntion(){……};
this.setB = fucntion(){……};
}
由于局部变量_b在函数作用域内定义,函数对象外部无法访问。同理,“局部”函数_getB也在函数作用域中定义,外部无法访问。然而,同处于函数作用域的getA和getB函数,得益于闭包机制,即使在对象(函数)定义完毕、代码执行结束(离开局部作用域)后,仍能访问局部变量_b和局部函数_getB,从而实现了私有成员和私有函数的封装。
静态变量与静态函数的定义
4. 静态变量和静态函数
此处指“静态变量和静态函数”。初看可能惊讶,既然闭包已能实现私有,为何还需静态概念?熟悉JavaScript的开发者了解原型(prototype)概念,它类似于类属性和类方法,但在运行期可任意修改。下面介绍JavaScript中静态变量和静态函数的实现方式。
在私有成员部分,介绍了利用闭包将“成员”定义在函数作用域以限制访问。那么如何实现所有对象共享的成员和函数?所谓“所有对象共享”,即这些成员的作用域与其他成员不同。回顾闭包概念,前文定义的对象在定义时,其作用域为整个函数作用域,new时会执行所有内容。如何让对象在new时,静态成员和静态函数不再被重新定义?关键在于,定义对象时它仍是一个函数。我们之前未写return,是因为将其视为对象使用。现在将其视为函数,若再return一个对象,则new时仅new return的对象。因此,外层函数定义的内容仅在定义时执行,new时不再执行。有人可能担心对象不再是外层函数对象,内部定义内容如何使用?别忘了“闭包”,return的函数仍在(外层)函数作用域内定义,它“有权”访问外层函数定义的内容。因此,静态变量和静态函数的定义如下:
var obj = (function(){
//static attribute
var obj_num = 0;
//static method
function add(){obj_num++};
return function(mem1){
this.a = mem1;
this.func = function(){};
//blow you can write some constructor codes
}
})();//最早看到这一行我就头大,现在看起来是多么的艺术啊^_^
通常静态方法是私有的。若需定义公有的静态方法,可添加:
obj.pubmethod = function(){
};
常量的定义与限制
5. 常量
常量指对象中不可改变的量。所谓“不可改变”,即在对象内部和外部均无法修改。私有变量在外部无法改变,若内部也无函数能修改其值,即可视为常量。
以上介绍了JavaScript中定义最基础对象的一些方法和技巧。语言越灵活,留给思考的空间越广阔。
感兴趣的朋友可使用在线HTML/CSS/JavaScript代码运行工具:http://tools.jb51.net/code/HtmlJsRun测试上述代码运行效果。
更多关于JavaScript相关内容感兴趣的读者可查看本站专题:《javascript面向对象入门教程》、《JavaScript错误与调试技巧总结》、《JavaScript数据结构与算法技巧总结》、《JavaScript遍历算法与技巧总结》及《JavaScript数学运算用法总结》。
希望本文所述对大家JavaScript程序设计有所帮助。
JS split切割后出现空字符串怎么过滤
2026-11-05 16:00:30
在 React 或 Vue 项目中封装使用 JS 节流防抖
2026-11-05 15:27:29
JavaScript中怎么将带小数的字符串转为整数?
2026-11-05 14:32:38
怎么用JavaScript策略模式重构电商促销计算逻辑?
2026-11-05 14:01:09
JS使用constructor判断数据类型可靠吗
2026-11-05 13:49:41
相关标签:
