首页 > 代码库 > js私有化属性

js私有化属性

我们先来看一个例子:

var Demo1 = function(val){      this.value =http://www.mamicode.com/ val;      this.getValue = http://www.mamicode.com/function(){            return this.value;      }    };var demo1Obj = new Demo1(1);alert(demo1Obj.value); // 1demo1Obj.value = http://www.mamicode.com/0;alert(demo1Obj.getValue()); // 0

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

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

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

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

如:

var Demo1 = function(val){      var value =http://www.mamicode.com/ val;      this.getValue = http://www.mamicode.com/function(){            return value;        };      this.increment = function(inc){           value += inc;      }};var demo1Obj = new Demo1(1);alert(demo1Obj.value); // 0demo1Obj.value = http://www.mamicode.com/0;demo1Obj.increment(4);alert(demo1Obj.getValue()); // 5

 

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

如下例所示:

var Demo2 = function(val){
  var value = http://www.mamicode.com/val;>return {
     increment: function(inc){
      if(typeof inc === ‘number‘){
        value += inc;
      }
     }, getValue :
function(){ return val; } }};var demo2Obj = new Demo2(4);alert(demo2Obj.getValue()); // 4
alert(demo2Obj.val);//undefined

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

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

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

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