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);
    }
    }

    笔记做完了。

  • 相关阅读:
    Linux 常用工具openssh之ssh-add
    Linux 常用工具openssh之scp
    Linux 常用工具openssh之ssh
    Linux 常用工具sysstat之sar
    Shell常用命令之sort
    Docker存储驱动之Device Mapper简介
    ceph-deploy install时,远端节点在执行apt-get update命令时失败
    Ceph osd启动报错osd init failed (36) File name too long
    rdb map出错rbd sysfs write failed
    Docker存储驱动之OverlayFS简介
  • 原文地址:https://www.cnblogs.com/javennie/p/2125842.html
Copyright © 2011-2022 走看看