我们先来看一个例子:

var Demo1 = function(val){
      this.value = val;
      this.getValue = function(){
            return this.value;
    }
};

var demo1Obj = new Demo1(1);
alert(demo1Obj.value);
demo1Obj.value = 0;
alert(demo1Obj.getValue()); 

Demo1的对象都会有一个value属性,在new的时候进行初始化。但是value本身却不是私有属性,我们可以通过'.value'的方式直接访问改属性。

但是如何将value属性私有化呢?

这里主要问题就是定义value变量直接定义在了this对象的属性上,这就让每个Demo1的对象都拥有了value属性,

其实我们可以将value定义为只存在于对象初始化时,让value变成Demo1函数中的局部变量,这样其他在函数外部就访问不到了,同时我们也给于其对象以访问该属性的接口

如:

var Demo1 = function(val){
      var value = val;
      this.getValue = function(){
            return value;
      };
      this.increment = function(inc){
           value += inc;
      }
};

var demo1Obj = new Demo1(1);
alert(demo1Obj.value);
demo1Obj.value = 0;
demo1Obj.increment(4);
alert(demo1Obj.getValue()); 

其实我们可以用到闭包的知识,

如下例所示:

var Demo2 = function(val){  var value = val;
    return {     increment: function(inc){      if(typeof inc === 'number'){        value += inc;      }     },
        getValue : function(){
            return val;
        }
    }
};

var demo2Obj = new Demo2(4);
alert(demo2Obj.getValue());  // 4alert(demo2Obj.val);//undefined

在Demo2中,实例化对象后发挥的是一个新的结构体,该结构体中的方法可以访问到他被创建时的上下文,就是我们所说的闭包。我们可以调用该闭包中的函数getValue,获取在实例化时传入的参数val的值。

注:这里在闭包中访问到的值,也不是该属性值的拷贝,而是其本身,因而increment中是可以对其进行修改的。

而且value的值是无法在外部直接获取到的,这就实现了对象属性的封装,同时也可以通过闭包的形式对其进行相应权限的操作。

总之,私有化属性的方法就是不将属性直接定义在this对象上,而是放到整个函数的局部变量中。

js私有化属性的更多相关文章

  1. js对象属性 通过点(.) 和 方括号([]) 的不同之处

    //    js对象属性 通过点(.) 和 方括号([]) 的不同之处 //    1.点操作符: 静态的.右侧必须是一个以属性名称命名的简单标识符.属性名用一个标识符来表示.标识符必须直接出现再js ...

  2. js获取属性

    js获取属性的方法: document.getElementById(); document.getElementsByTagname(); document.getElementsByClassna ...

  3. js中属性类型:数据属性与访问器属性

    js中属性类型分为两种:数据属性和访问器属性 在js中,对象都是由名值对构成的,名:就是我们所说的属性名,值就是属性对应的值(基本值.对象.方法). ECMA-262第5版定义了只有内部才用的特性,描 ...

  4. JS中"属性"的用法

    JS的属性和C#有相似之处  ! 使用get和set来进行属性的获取和设置 var obj={ a:"1", get age(){ return obj.a; }, set age ...

  5. JS修改属性,六种数据类型

    JS修改属性 一般修改单个属性是通过JS修改的,比较方便.改多个属性通过css样式改更方便. 1.特殊:通过JS修改包含"-"符号的属性,例如margin-top // 特殊 修改 ...

  6. 动态设置js的属性

    目标:js的属性名能够使用变量 举例:js对象object,当赋给该对象属性的时候能够採用下面方式 var object; object.prop1 = "value1"; obj ...

  7. Vue.js 计算属性是什么

    Vue.js 计算属性是什么 一.总结 一句话总结: 模板 表达式 维护 在模板中表达式非常便利,但是它们实际上只用于简单的操作.模板是为了描述视图的结构.在模板中放入太多的逻辑会让模板过重且难以维护 ...

  8. javascript 私有化属性,和公共属性

    function TestClassA(name, number) { this.name = name; //public this.number = number; //public var ac ...

  9. Python 私有化属性

    # 对象的基本理论 # 什么事对象? # 万物皆对象 # 对象是具体物体 # 拥有属性 # 拥有行为 # 把很多零散的东西,封装成为一个整体 # 举例:王二小 # 属性 # 姓名 # 年龄 # 身高 ...

随机推荐

  1. 键盘事件之keydown keypress keyup区别

    经过测试,显然事件执行的顺序是: keydown->keypress->keyup. 但是连续按一个按键的话,会一直触发:keydown keypress.直到你提起按键,会触发keyup ...

  2. CSS中为什么overflow:hidden能清除浮动(float)的影响?原理是什么?

    http://www.zhihu.com/question/30938856 父块没有设置指定的高宽,当子块设置为浮动后,原本包裹子块的父块的高度塌陷消失,这时给父块设置overflow:hidden ...

  3. (c#)WinForm遍历所有控件

    遍历WinForm中的所有控件,只执行一次以下语句是不行的 foreach (Control ctl in this.Controls) { } 这样只能遍历到第一层控件,子控件是遍历不到的,要想遍历 ...

  4. Linux修改Shell命令提示符及颜色

    Linux修改Shell命令提示符及颜色 1. Linux登录过程中加载配置文件顺序: /etc/profile → /etc/profile.d/*.sh → ~/.bash_profile → ~ ...

  5. VirtualBox安装linux增强工具报错

    错误提示: Building the OpenGL support module                         [FAILED] 解决办法 cd /media/VBOXADDITIO ...

  6. ACID:数据库事务正确执行的四个基本要素

    ACID,指数据库事务正确执行的四个基本要素的缩写.包含:原子性(Atomicity).一致性(Consistency).隔离性(Isolation).持久性(Durability).一个支持事务(T ...

  7. mysql性能优化学习笔记(6)数据库配置优化&硬件优化

    一.操作系统配置优化:          1. 网络方面,修改/etc/sysctl.conf文件,增加tcp支持的队列数,减少断开连接时,资源的回收.          2. 打开文件数的限制.修改 ...

  8. JavaScript学习笔记(三)this关键字

    this是Javascript的关键字,代表在函数运行时,自动生成一个内部对象,只能在函数内部使用.例如: function test() { this.x = 1; } 随着函数的使用场合不同,th ...

  9. Static Function Test

    public class StaticTestCls { public int x = 0; public static int y = 0; private void SetValue_Object ...

  10. AndroidUI 视图动画-混合动画效果 (AnimationSet)/动画效果监听

    在前面介绍了几种动画效果:透明动画效果(AlphsAnimation).移动动画效果(TranslateAnimation).旋转动画效果(RotateAnimation).缩放动画效果(ScaleA ...