添加对私有数据成员的支持
来源:互联网 发布: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,"<").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);//因为是私有变量所以不能在外部访问到,输出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,"<").replace(/>/g,">"); } }; } 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>no<=no
阅读全文
0 0
- 添加对私有数据成员的支持
- 对类里成员函数返回私有数据成员的操作
- 对私有继承成员的公有化
- 类的私有数据成员的访问
- 私有数据成员的继承问题
- JAVA中的反射机制对私有成员的访问
- C# 反射机制(reflection)实现对私有成员的访问
- JavaScript的私有成员
- 它的私有成员
- 类中私有数据成员的可访问性
- 是不是通过指针的指针改变了私有数据成员?
- 友函数访问类的私有数据成员
- 子类无权访问父类的私有数据成员
- C++私有数据成员提取到类外的方法总结
- 使用成员函数访问私有数据成员
- linux内核添加对oprofile 的支持
- 为Android添加对WML的支持
- 添加对https协议的支持
- HTML中的行级标签和块级标签
- Spring SSH
- MySQL中文取首字母实现
- MySQL存储过程实现更新UUID
- VirtualPlanetBuilder入门简介
- 添加对私有数据成员的支持
- 《Metasploit 魔鬼训练营》博客目录
- 客观题 编程综合
- java文件上传
- 题目1041:Simple Sorting
- 把库转换为一个jQuery插件
- 计算机修炼之路--------Tomcat的安装配置
- 单片机C简单定时计数组件
- windows下使用composer为YII框架安装redis扩展