js私有化属性

我们先来看一个例子:

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

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

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); // 0
demo1Obj.value = 0;
demo1Obj.increment(4);
alert(demo1Obj.getValue()); // 5

 

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

如下例所示:

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()); // 4
alert(demo2Obj.val);//undefined

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

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

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

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

js私有化属性,古老的榕树,5-wow.com

郑重声明:本站内容如果来自互联网及其他传播媒体,其版权均属原媒体及文章作者所有。转载目的在于传递更多信息及用于网络分享,并不代表本站赞同其观点和对其真实性负责,也不构成任何其他建议。