添加对私有数据成员的支持

问题:你已将发现了可复用的功能,并且创建一个对象,将该功能定义为对象的方法。然而还需要添加对私有数据成员的支持
解决方案:确保一个数据成员不会暴露给公共访问的一种方法是,将该对象从新定义为一个函数,它带有公开暴露的方法,或者带有使用私有数据或方法的数据对象。
例如我们对下列对象改写,添加对私有数据成员的支持

var clObject = {
  //获取样式表的样式
  getStyle:function(obj,styleName){
    if(obj.currentStyle){
      return obj.currentStyle[styleName];
    }else if(document.defaultView && document.defaultView.getComputedStyle){
      return document.defaultView.getComputedStyle(obj,null).getPropertyValue(styleName);
    }
    return undefined;
  },
  getElem:function(id){
    return document.getElementById(id);
  },
  stripslashes:function(str){
    return str.replace(/\\/g,'');
  },
  removeAngleBrackets:function(str){
    return str.replace(/</g,"&lt;").replace(/>/g,"&gt;");
  }
}
console.log(clObject.toString());
console.log(clObject.removeAngleBrackets("yes>no<=no"));

简单的函数到对象的转换,在全局命名空间上要比在单个函数上容易,然而这种性质的一次性对象也有缺点,包括不能添加可供所有对象方法访问的私有数据。
有一种方法将对象转化为声明的函数并且曝光所有方法,使用this。

//不能添加私有变量
var ownObject = {
    name:"grey",
   getElem:function(id){
    return document.getElementById(id);
  },
}
console.log(ownObject.name);
//使用this 将对象转化为声明函数,暴露方法但是不暴露私有数据变量
function ownFuntion(){
    var name ="gray";
    this.getName = function(){
        return name;
    }
}
var obj = new ownFuntion();
console.log(obj.name);//因为是私有变量所以不能在外部访问到,输出undefined
console.log(obj.getName());//gray,暴露的方法来访问内部的私有数据变量

还有一种更高效优雅的方法,就是使用IIEF来封装对象的方法和数据。这种方法创建了一个单体,就是一个单个的对象,而不是实例化的对象,它还允许我们使用一个函数或一个对象作为库对象的核心。
与简单对象相比其主要差异在于:
+ 单体实现在init()中创建,当调用getInstance()函数的时候会调用init方法,如果该实例已经存在,则返回最初已经存在的实例,如果没有就创建一个新的实例,

var clSingleton = (function(){
    var instance;
    function init(){
        var replacementStr = "**";
        return {
            //返回元素
            getElem:function(id){
                return document.getElementById(id);
            },
            stripslashes:function(str){
                return str.replace(/\\/g,'');
            },
            removeAngleBrackets:function(str){
                 return str.replace(/</g,"&lt;").replace(/>/g,"&gt;");
            }
        };
    }
    return {
        //如果存在的话,获取单体实例
        //或者如果不存在的话,就创建一个
        getInstance:function(){
            if(!instance){
                instance = init();
            }
            return instance;
        }
    };
})();
var clcb = clSingleton.getInstance();
var clcb2 = clSingleton.getInstance();
console.log(clcb ===clcb2);//true
console.log(clcb.removeAngleBrackets("yes>no<=no"));//yes&gt;no&lt;=no
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值