由于js语言自身语法的灵活性,使得在js程序中出现了各种各样的代码风格,但也正因为如此,导致了代码的可读性和可维护性大大降低,特别随着项目的不断更新,js代码的不断增多,到后期维护时甚至连自己写的代码都不知所以然了,因此确定一种好的代码风格是很有必要的。
近两年随着ajax的兴起,js变得越来越受“重用”,js开始在web开发中中充当着非常重要的角色,因此也开始遇到了各种各样的问题。于是很多牛人们就提出了js的面向对象编程方法。
使用面向对象的编程思想实现js代码其实也并不难,实现方法也又多种,比如prototype原型,new object()等方法。前面的每个方法都有其自己的优缺点,但都存在一个问题,那就是对于js变量作用域的控制。如果不能很好控制js变量作用域,就可能导致对象内部变量被外部肆意修改,从而导致程序被破坏,不便于程序的维护,对象的封装特性和程序健壮性都大打折扣。被由于js本身没有很好的对变量范围的定义(public/private等限定符),因此在js的面向对象编程中也就遇到了变量的控制问题,特别是对于对象内部的公有变量在prototype原型方法中都很难实现。
如下面一段程序:
function testCls(a){
this.a=a;
}
testCls.prototype.alertA=function(){
alert(this.a);
}
var test=new testCls(5);
test.alertA(); //弹出5
alert(test.a); //同样弹出5
要在其方法alertA中显示对象的内部公用变量a的值就必须在构造函数中通过this赋值,然后在方法中通过this引用。这样本身是没有什么问题,但这样a变量其实就成了一个全局变量,任何testCls的对象都可以直接引用到a,如上例中通过test.a获取到a的值。但很多时候我们并不希望一些对象变量对外公开,即不允许外部程序访问。这应该如何实现呢?如何才能实现一种更好的面向对象编程方式呢?
当然我们可能都会想到这种方式:
var testCls=function(arg1){
var a=arg1;
var b=10;
var alertB=function(){
alert(b);
}
this.c=5;
this.setA=function(v){
a=v;
};
this.alertA=function(){
alert(a);
};
this.alertB=function(){
alertB();
}
}
var test=new testCls(4);
test.setA(6);
test.alertA();
test.alertB();
这样其实也很好解决了上面提到的问题,但是总又点不雅观,所有变量和方式都混杂在一起看起来很难区分哪些是可以公开访问哪些是不允许公开访问的,哪些是对象的私有变量和公开变量。这样在可读性上就有点差强人意了,我们可以去寻找一种更为雅观的实现方式。
其实只要利用js的闭包特性这个问题就很好搞定了,这也是俺从ext的源码中学习到的。
示例代码如下:
var testCls=function(arg1){
//对象内部公有变量,不允许外部访问
var a=arg1;
var b=10;
var alertB=function(){
alert(b);
}
//外部可访问区域
return {
c:5,
setA:function(v){
a=v;
},
alertA:function(){
alert(a);
},
alertB:function(){
alertB();
}
}
};
var test=new testCls(4);
test.setA(6);
test.alertA();
test.alertB();
同样的实现上面的功能,而且将对象私有变量和公有变量完全分开区域,一目了然,很容易区分出哪些是私有变量哪些是公有变量,这样程序的可读性就得到了大大的提高,而且对对象变量也得到了很好的控制。
如此优美的实现方法,真的让我们不得不叹服js的伟大,当然也要赞一下Extjs的开发者们。
分享到:
相关推荐
JavaScript语法简洁,易于学习,但功能强大,支持面向对象、函数式和命令式编程风格。 DOM(Document Object Model)是JavaScript操作HTML文档的核心接口。它将HTML或XML文档解析为一个可编程的对象模型,允许...
随后,为了更好地推广这一新语言,网景将其重命名为JavaScript,旨在与当时非常热门的面向对象编程语言Java建立联系,尽管这两种语言在技术和语法上并无直接关联。 #### 二、JavaScript的核心概念与特性 - **面向...
JavaScript是一种基于原型的面向对象编程语言,其面向对象特性主要体现在封装、继承和多态上。在本篇文章中,我们将重点讨论封装和继承这两个概念,以及它们在JavaScript中的实现。 **封装**是面向对象编程的核心...
它是一种基于原型、多范式的动态脚本语言,并且支持面向对象、命令式以及函数式编程风格。JavaScript常用于客户端浏览器中,使网页具备交互性,但它同样适用于服务器端编程,如Node.js环境,以及游戏开发、物联网、...
4. Class:类的语法糖,提供了更面向对象的编程风格。 5. 模块化:import和export引入和导出模块。 八、JavaScript框架与库 1. jQuery:简化DOM操作和事件处理的库。 2. React:Facebook开发的用于构建用户界面的库...
它支持面向对象编程、命令式编程以及函数式编程风格。JavaScript最初由Netscape公司的Brendan Eich在1995年设计,并随着Web的发展逐渐成为了一种标准的技术。 ##### 2.2 JavaScript的特点 - **脚本语言**:...
JavaScript还支持函数式编程风格,使得函数本身也可以作为值进行传递和操作。对象是JavaScript中的核心概念,它们是属性(键值对)的集合,可以通过字面量语法或构造函数创建。随着ES6的引入,类的概念被引入...
为了更好地推广这门语言,网景公司又将其更名为JavaScript,试图与当时流行的面向对象语言Java建立联系,尽管二者实际上并没有关联。这一策略非常成功,使得JavaScript迅速普及开来。 #### 二、JavaScript基础概念 ...
以下是关于JS建立对象的一些详细方法和理解: 1. **字面量语法**: 创建对象最简单的方式是使用字面量语法。字面量语法允许你直接定义一个对象,如下所示: ```javascript var person = { firstname: "John", ...
"programming-fundamentals: JS Bangladesh在“使用JavaScript编程基础知识”课程中使用的文件"这一标题表明了这是一系列关于JavaScript基础教学的资料,由JS Bangladesh提供,旨在帮助初学者掌握JavaScript的核心...
了解如何创建对象、定义方法,以及利用原型和原型链实现继承,是掌握JavaScript面向对象编程的关键。 三、函数与闭包 函数是JavaScript中的第一等公民,可以作为参数传递、作为返回值返回。闭包是JavaScript中一个...
8. **原型与继承**:JS使用原型链实现面向对象编程,理解原型对象、`__proto__`和`prototype`属性,以及如何利用这些机制进行类继承,对于编写复杂应用至关重要。 9. **作用域与闭包**:了解变量的作用域规则(全局...
JavaScript是由Netscape公司的Brendan Eich在1995年发明的,它是一种解释型、面向对象的语言,支持事件驱动和函数式编程风格。JavaScript通常与HTML和CSS一起使用,构建动态网页。 2. **变量和数据类型**:在...
它是一种解释型、弱类型、基于原型的语言,支持函数式、面向对象和命令式编程风格。 接下来是《第2章 JavaScript语言基础》。这里会涵盖变量声明(var、let、const)、数据类型(包括基本类型:字符串、数字、布尔...
5. **面向对象编程**:JavaScript支持基于原型的面向对象编程,包括构造函数、原型链、继承、封装等概念,这些例子有助于深入理解JavaScript的面向对象特性。 6. **闭包与作用域**:理解JavaScript的函数作用域、...
JS对象封装是JavaScript编程中的核心概念,它涉及到面向对象编程的基本原则。在JavaScript中,对象是通过原型(prototype)机制来实现的。本文将详细讲解几种常见的JS对象封装方式。 1. **常规封装**: 常规的JS...
它是一种解释型、弱类型、基于原型的语言,支持函数式、面向对象和命令式编程风格。JavaScript代码通常嵌入HTML中,通过事件驱动或服务器响应来改变网页内容。 2. **JavaScript语言基础** (第2章) - **变量与数据...
面向对象编程有助于代码重用、模块化和更好的组织结构,从而提高代码的可维护性和可扩展性。 2. **MySQL数据库**: MySQL是一种流行的开源关系型数据库管理系统(RDBMS),用于存储和管理Web应用中的数据。它提供...