`
kong0itey
  • 浏览: 305837 次
社区版块
存档分类
最新评论

js面向对象--理解闭包

阅读更多
由于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面向对象编程.

    在提供的资源中,《代码之美》PDF文件可能包含了关于编程实践和代码风格的指导,而《Javascript面向对象编程》PPT可能更具体地阐述了JavaScript OOP的细节和示例。学习这些材料将有助于深入理解JavaScript的面向对象...

    JavaScript面向对象编程指南(第2版).rar

    JavaScript是一种广泛...通过深入学习这本《JavaScript面向对象编程指南(第2版)》,开发者不仅能掌握JavaScript的面向对象编程基础,还能了解到实际项目中如何有效地运用这些知识,提升编程技巧和解决问题的能力。

    JavaScript面向对象编程指南.pdf

    JavaScript面向对象编程是指在JavaScript语言中使用面向对象的方法来编写程序。JavaScript是一种高级的、解释型的编程语言,它支持面向对象的编程范式,允许开发者创建对象、使用继承和多态等面向对象的特性。以下是...

    JavaScript面向对象编程指南

    JavaScript是一种广泛应用于Web开发的动态编程语言,尤其在构建交互式网页和富互联网应用...《JavaScript面向对象编程指南》这本书将帮助你进一步探索这个主题,通过实例和详细的解释,提升你的JavaScript编程技能。

    面向对象JavaScript开发

    JavaScript,作为一种广泛应用...JavaScript 面向对象程序设计——继承与多态.pdf 和 JavaScript 面向对象程序设计——封装.pdf 这两个文档可能深入探讨了这些主题,帮助读者深入理解并掌握JavaScript的面向对象开发。

    Javascript面向对象基础.rar

    以上就是JavaScript面向对象基础的一些关键点,掌握这些知识对于深入理解JavaScript和进行高效的代码编写至关重要。在实际编程中,还需要结合实际场景灵活运用这些概念,同时,随着JavaScript的发展,如ES6及后续...

    javascript 经典面向对象设计

    ### JavaScript经典面向对象设计 #### 标题与描述解析 标题“JavaScript经典面向对象设计”指出了本书的主要内容是关于如何使用面向对象编程(OOP)原则和技术来编写高质量、可扩展且可重用的JavaScript应用程序及...

    JavaScript面向对象编程

    JavaScript面向对象编程是一种基于原型(Prototype)的编程范式,它是动态类型语言,允许开发者创建具有复杂特性的对象。在JavaScript中,面向对象主要通过构造函数、原型链和闭包来实现。以下是对这一主题的详细...

    Javascript之面向对象--封装

    在探讨JavaScript的面向对象编程时,"封装"是一个核心概念。封装是面向对象编程的三大基本特性之一,它指的是将数据(属性)和操作数据的代码(方法)绑定在一起,形成一个对象,并对外隐藏对象的实现细节,只保留...

    javascript基础-->中级-->高级-->面向对象

    四、JavaScript面向对象 1. 构造函数与new操作符:构造函数用于创建特定类型的对象,new操作符则是调用构造函数的手段。 2. prototype与__proto__:两者都与原型链有关,prototype是构造函数的属性,__proto__是...

    js真正了解面向对象.pdf

    以下是一些关于JavaScript面向对象的知识点: 1. 数据类型: JavaScript具有五种基本数据类型:number、string、boolean、object和undefined。其中,object类型包含了如Date、Array、Math等内置对象类,以及自定义...

    JavaScript面向对象编程案例

    `JavaScript面向对象编程讲解.pptx`可能提供了更详细的理论解释和更多示例,帮助读者深入理解面向对象编程在JavaScript中的应用。 学习JavaScript面向对象编程,不仅有助于理解代码的结构和复用性,还有助于提高...

    js面向对象知识

    JavaScript是一种广泛应用于Web开发的脚本语言,尤其在构建交互式网页和动态应用程序时不可或缺。在JavaScript中,面向对象编程...通过这些资源,开发者可以深入了解JavaScript面向对象编程,提升自己的编程技能。

    javascript闭包的理解

    标题《JavaScript闭包的理解》涉及的知识点主要围绕JavaScript编程中的一个重要概念——闭包。...对于初学者来说,理解闭包的原理和作用域链是非常有帮助的,而随着经验的增长,闭包会成为JavaScript编程中的一把利器。

    JavaScript面向对象的支持

    JavaScript是一种广泛应用于Web开发的脚本语言,它虽然支持面向对象编程,但其面向对象的实现方式与其他传统面向对象语言有所不同。这篇PPT主要探讨了JavaScript中的面向对象特性,包括对象、类型系统以及一些特殊...

    js闭包详细讲解

    要理解闭包,首先需要了解JavaScript的作用域规则。 ##### 1.1 作用域 在JavaScript中,变量根据其声明的位置,可以分为两种类型: - **全局变量**:在整个程序中都可被访问。 - **局部变量**:只在其声明的函数...

Global site tag (gtag.js) - Google Analytics