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

来源:互联网 发布:java cors 跨域 编辑:程序博客网 时间:2024/06/16 14:00

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

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);//因为是私有变量所以不能在外部访问到,输出undefinedconsole.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);//trueconsole.log(clcb.removeAngleBrackets("yes>no<=no"));//yes&gt;no&lt;=no
原创粉丝点击