zoukankan      html  css  js  c++  java
  • Javascript 实现私有成员变量

    Javascript 方法中这样写的话,相当于声明了成员变量:

    View Code
    1 function foo() {
    2 this.data =0;
    3 }

    但当我们试图访问它时仍会出错:

    View Code
    1 function bar() {
    2 // foo.data未定义
    3 alert(foo.data);
    4 }

    这时可以通过使用new关键字来解决,就像我们实例化类一样:

    function bar() {
    theFoo
    =new foo();
    alert(theFoo.data);
    }

    但是问题也来了,Javascript没有访问修饰符,那么将导致所有成员变量都是公有的,为了解决这个问题做个试验,结果就没有办法再访问foo的实例theFoo.data了,这是因为方法调用完毕后,方法体内声明的变量也将消失了,而data现在已经不是成员变量,而是仅仅是方法体中的一个变量:

    function foo() {
    var data =0;
    }

    function bar() {
    theFoo
    =new foo();
    // theFoo.data未定义
    alert(theFoo.data);
    }

    但如果在方法退出后仍存一个成员方法在对这个变量进行引用,那么这个变量就仍然会存在,并且只有这个方法才能访问此变量,例如:

    function foo() {
    var data =0;

    this.setData =function () {
    data
    ++;
    alert(data
    );
    }
    }

    最后写成了这样,调用bar方法试试,没有办法直接访问data变量了,但它的值会累加(方法调用结束后变量没有消失),这样就实现了私有成员变量的模拟:

    function foo() {
    var data =0;

    this.setData =function () {
    data
    ++;
    alert(data);
    }
    }
    // 为了防止每次调用bar方法时都新建立foo的实例theFoo
    // 将实例化的部分放到了bar的外面
    var theFoo =new foo();
    function bar() {
    theFoo.setData();
    }

    也许模拟类时更爱这样写,不过这并不是最重要的:

    var foo =function () {
    var data =0;

    this.setData =function () {
    data
    ++;
    alert(data);
    }
    }

    笔记做完了。

  • 相关阅读:
    LVDS DP等显示器接口简介
    Eclipse智能感知及快捷键
    Error deploying web application directory D:apache-tomcat-8.0.26webappsservlet
    把tomcat默认的8080段口改成80端口
    警告: [SetPropertiesRule]{Server/Service/Engine/Host/Context} Setting property 'source' to 'org.eclipse.jst.jee.server did not find a matching property.
    软件危机
    SQL Server——热备份
    mysql热备份
    Oracle——热备份
    Nodejs基础
  • 原文地址:https://www.cnblogs.com/javennie/p/2125842.html
Copyright © 2011-2022 走看看