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