javaScript 利用闭包模拟对象的私有属性
来源:广州中睿信息技术有限公司官网
发布时间:2012/10/21 23:25:16 编辑:admin 阅读 397
JavaScript缺少块级作用域,没有private修饰符,但它具有函数作用域。作用域的好处是内部函数可以访问它们的外部函数的参数和变量(除了this和argument。内部中的函数中的this指

JavaScript缺少块级作用域,没有private修饰符,但它具有函数作用域。作用域的好处是内部函数可以访问它们的外部函数的参数和变量(除了this和argument。内部中的函数中的this指向全局对象,argument指向内部函数的函数参数)。我们可以利用这种属性来模拟面向对象中的私有属性。

var myObject=function(value){   var value=value || 0;      return{    increment:function(num){     value+=typeof num==='number' ? num : 0;    },    setValue:function(num){     value = typeof num==='number' ? num : value;    },    getValue:function(){     return value;    }   }  }(10)    //alert(myObject.getValue());  //10  myObject.setValue(20);  //alert(myObject.getValue());  //20    myObject.increment(5);  alert(myObject.getValue());  //25

 

如上例中,myObjeact是匿名函数执行后返回的对象。匿名函数中变量value对于匿名函数外部来说是不可访问的,但对于其内部的函数,是可以访问的,匿名函数执行结束,由于变量value仍被返回的myObject对象所存取,故value所占据的内存并没有被销毁。此时,内部的变量value就如同myObject对象的私有变量一样。

 

var myObject=function(value){   var name='MyObject';   return{    increment:function(num){     value+=typeof num==='number' ? num : 0;    },    setValue:function(num){     value = typeof num==='number' ? num : value;    },    getValue:function(){     //alert(this);     return value;    },    getName:function(){     return name;    },    setName:function(nameStr){     name=nameStr;    },    toString:function(){     return '[Object:'+name+']';    }   }  }      var obj=myObject(5);  obj.increment(6);     //alert(obj.getValue());  // 11  //alert(obj);   //[Object:MyObject]  obj.setName('temp object 01');  alert(obj)   //[Object:temp object 01]
联系我们CONTACT 扫一扫
愿景:成为最专业的软件研发服务领航者
中睿信息技术有限公司 广州•深圳 Tel:020-38931912 务实 Pragmatic
广州:广州市天河区翰景路1号金星大厦18层中睿信息 Fax:020-38931912 专业 Professional
深圳:深圳市福田区车公庙有色金属大厦509~510 Tel:0755-25855012 诚信 Integrity
所有权声明:PMI, PMP, Project Management Professional, PMI-ACP, PMI-PBA和PMBOK是项目管理协会(Project Management Institute, Inc.)的注册标志。
版权所有:广州中睿信息技术有限公司 粤ICP备13082838号-2