zoukankan      html  css  js  c++  java
  • JS学习笔记-OO疑问之封装

             封装是面向对象的基础,今天所要学习的匿名函数与闭包就是为了实现JS的面向对象封装。封装实现、封装变量,提高数据、系统安全性,封装正是面向对象的基础。


    一、匿名函数


            即没有名字的函数,其创建方式为

                     function(){...}

            单独存在的匿名函数,无法执行,可通过赋值给变量调用或通过表达式自我执行来实现执行。

                      1.赋值给变量为一般的函数使用方式

                              var run = function(){

                                       return '方法执行中';

                              };

                              alert(run());

                      2.通过表达式自我运行

                              (function(arguments可选)

                              {

                                       alert('方法执行中');

                               })(arguments);


    二、闭包


            在一个普通函数的内部,创建一个匿名函数,匿名函数可訪问普通函数中的变量,进而实现类似于面向对象中封装的特性,这个匿名函数就叫做相应普通函数的闭包。闭包就是对外创建的接口,通过接口达到訪问函数内部变量的效果。

            functionrun() {

                     var username = 'Forrest';

                     return function () { //通过匿名函数返回 box()局部变量

                              return username;

                     };

            }

             //alert(username);                  //错误username is not defined

            alert(run()());

           特点:闭包中使用的局部变量会驻留在内存中,避免了使用全局变量造成的命名冲突等情况的发生。值得注意的是闭包中使用thiskeyword,指向的是window对象。

     

    三、封装


             为了更好的安全性、数据保护,则须要对数据进行私有化的封装,而JS中没有块级作用域的概念(即出了{}的范围,仍能够訪问声明的变量),但有了前面的基础,我们就能够达到像其它正规面向对象语言的封装效果。

     function user(){
    	 (function(){
    		 for(i = 0; i<5; i++){
    			 alert(i);
    		 }
    	 })();
    	 alert(i);                          //此处无法訪问变量i
     }
     //私有作用域取代全局变量
     (function(){
    	 var username= 'Forrest';
    	 alert(username);
    })();                                  //匿名函数运行完成后,变量马上销毁
    
     //訪问私有变量
     function User(){
    	var username= Forrest;            //私有变量
    	function learn(){                 //私有函数
    		 return '学习中';
    	 };
    
    	 //对外提供接口,间接訪问内部成员
    	 this.userlearn = function(){
    		 return username + learn();
    	 };
     }  
     var user = new User()
     alert(user.userlearn());
    
     //实现get()、set()
     function User(value){
    	 var user = value;
    	 this.getUser = function(){
    		 return user;
    	 }
    	 this.setUser = function(value){
    		 user = value;
    	 }
     }
     var user = new User('Forrest');
     alert(user.getUser());
     user.setUser('Li');
     alert(user.getUser());
    
     //静态私有变量
     (function(){
    	 var user = '';
    	 User = function(value){
    		 user = value;
    	 };
    	 User.prototype.getUser = function(){
    		 return user;
    	 };
    	 User.prototype.setUser = function(value){
    		 user = value;
    	 };
     })();
    
     
     //字面量方式的私有化
     function NormalUser(){}
     var user = function(){
    	 var user = 'Forrest';
    	 function learn(){
    		 return user + '学习中...';
    	 };
    	 var nu = new NormalUser();
    	 nu.userlearn = function(){
    		 return learn();
    	 };
    	 return nu;
     }();
     alert(user.userlearn());

             

    结语:


             JS虽不是一门正统的面向对象的语言,但用它也能达到面向对象的封装、继承、多态等的效果,学习起来还是须要好好理解的,特别是对于使用JS不是特别多的人来说,仅仅能等到以后的逐步应用来解决这一系列的问题,更进一步体会它在面向对象方面的应用。

  • 相关阅读:
    第一阶段
    堆栈的内容------全局变量(实例变量)---静态变量等等
    this和引用变量的地址值是同一个---------new后面的是构造方法
    引用数据类型的传递,那个值先输出,后面的也同样是同一个值
    基本数据类型的传递,参数传递的是具体的值
    构造方法和构造代码块
    装饰器初识
    Bootstrap框架
    Django ORM那些相关操作
    jQuery
  • 原文地址:https://www.cnblogs.com/mfrbuaa/p/4001426.html
Copyright © 2011-2022 走看看