明白javascript封装
封装可以被定义为对对象的内部数据表现形式和实现细节进行隐藏。通过封装可以强制实施信息隐藏。
在JavaScript中,并没有显示的声明私有成员的关键字等。所以要想实现封装/信息隐藏就需要从另外的思路出发。我们可以使用闭包的概念来创建只允许从对象内部访问的方法和属性,来达到封装的要求。
基本方式
一般来说,我们学用的有三种方法来达到封装的目的。
使用来声明一个变量,然后再声明getXXX、setXXX等取值、赋值的方法。
使用this._XXX来声明一个变量,然后再声明getXXX、setXXX等取值、赋值的方法。
利用“函数作用域”这一个概念来做。
1. 门户大开型
var Book = function(isbn,title,author){ sbn(isbn); itle(title); uthor(author); }; otype = { setIsbn: function(isbn){ = isbn; }, getIsbn: function(){ return ; }, setTitle: function(title){ e = title; }, getTitle: function(){ return e; }, setAuthor: function(author){ or = author; }, getAuthor: function(){ return or; } };
使用这种方法实现的.封装,虽然实现了取值器与赋值器以保护私有属性。但是在实际使用中,私有属性依然可以从外部访问,所以从根本上讲,没有实现封装。
2. 用命名规范进行区别
var Book = function(isbn,title,author){ sbn(isbn); itle(title); uthor(author); }; otype = { setIsbn: function(isbn){ this._isbn = isbn; }, getIsbn: function(){ return this._isbn; }, setTitle: function(title){ this._title = title; }, getTitle: function(){ return this._title; }, setAuthor: function(author){ this._author = author; }, getAuthor: function(){ return this._author; } };
使用这种方法与第一种类似,区别在于使用不同的命名来保护私有属性的使用。但是,从实际应用来说其仍然没有实现封装。
3. 使用函数作用域
var Book = function(newIsbn,newTitle,newAuthor){ var isbn,title,author; sbn=function(newIsbn){ isbn = newIsbn; }; sbn=function(){ return isbn; }; itle=function(newTitle){ title = newTitle; }; itle=function(){ return title; }; sbn=function(newAuthor){ author = newAuthor; }; sbn=function(){ return author; }; }
由于在JavaScript的函数中声明的变量是有作用域的,所以使用这种方法可以避免在外部直接访问私有属性。基本达到封装所要求的内容。
这里要注意的是,我们在函数的内部,可以使用以及var来声明变量。区别是使用声明的变量在外部是可以访问的。使用var声明的变量,由于受到函数作用域的保护,在函数的外部是无法直接访问的。
4. 使用函数作用域的变形
var Book = (function(){ // ...其他静态方法 return function(newIsbn,newTitle,newAuthor){ var isbn,title,author; sbn=function(newIsbn){ isbn = newIsbn; }; sbn=function(){ return isbn; }; itle=function(newTitle){ title = newTitle; }; itle=function(){ return title; }; sbn=function(newAuthor){ author = newAuthor; }; sbn=function(){ return author; }; }; })();
这种方法是直接返回一个构造器的执行。且这里的构造器是一个内嵌函数。
这种方法的优点是“在内存中只会存在一份。因为其他静态方法被声明在构造器之外,所以它们不是特权方法。”
判断一个方法是否应该被设计为静态方法的原则是“这个方法是否会访问私有属性”。如果它不需要,那么将其设计为静态方法会更有效率,因为它只会被创建一份。
常量
我们可以使用“只有取值器,没有赋值器”的方式来实现常量。
// 1. var Book = function(){ var constants = ["key1": "1","key2": "2","key3": "3"]; onstant = function(key){ return constants[key]; }; }; onstant("key1"); // 2. var Book = (function(){ var constants = ["key1": "1","key2": "2","key3": "3"]; var con = function(){}; onstant = function(name){ return constants[name]; }; return con; })(); onstant("key1");
利弊
1、利处
封装保护了内部数据的完整性;
封装使对象的重构更轻松;
弱化模块间的耦合,提高对象的可重用性;
有助于避免命名空间冲突;
……
2、弊处
私用方法很难测试;
必须与复杂的作用域链打交道,使错误调度更困难;
容易形成过度封装;
JavaScript并不原生支持封装,所以在JavaScript中实现封装存在复杂性的问题;
相關文章
-
理解JavaScript中的封装与继承特性
JavaScript中的封装封装简单地说就是让外界只能访问对象的共有变量和函数,隐藏细节和数据。js中有三种方法创建对象,分别为门户大开型、用命名规范区分私有变量、闭包创建真正的私有变量三种。1.门户大开型,是实现对 -
使用JavaScript实现Java的List功能
复制代码 代码如下:/*** js模拟java中的List*/var list = new Array();/*** 添加* @param {Object} object*/function add(object) {list[th] = object;}/*** 移除此列表中指定位置上的元素。* @param index 指定位置 -
java与javascript之间json格式数据互转详解
创和谐支部——传播学学生党支部活动总结文化传播学院传播学学生党支部简介 文传学院传播学学生党支部于XX年9月从文传学院学生党支部独立,是一个新鲜的积极向上、勇于创新、充满生机与活力的支部。目前,支部共有党员23 -
java与JavaScript语言有何不同
java和JavaScript是两个不同的语言。那么这两个语言有什么不同呢?下面本站小编带大家一起来看看详细内容,希望对大家有所帮助!想了解更多相关信息请持续关注我们应届毕业生考试网! 讲个故事:话说很久很久以前,有一个 -
JavaScript与java语言有何区别
铁皮石斛属于中药材,这一点大家都比较清楚,而且铁皮石斛叶子还具有美容养颜,增强免疫力,降低血糖等功效,也就是说对于我们人体的健康养生是非常有帮助的,而且用铁皮石斛叶子泡茶可以很简单的利用其营养价值,下面我就和大家一 -
JavaScript与java语言有何不同
java和JavaScript是两个不同的语言。那么这两个语言有什么不同呢?下面本站小编带大家一起来看看详细内容,感兴趣的小伙伴们可以参考一下!想了解更多相关信息请持续关注我们应届毕业生考试网! 1 语言特点: 1.1 弱 -
在Java中执行JavaScript代码
我们要在Java中执行中的execute(s1,s2)方法,文件内容如下:function execute(s1, s2){ retu s1 + s2;}首先需要定义一个接口,这个接口中给出与要执行的JavaScript方法一样的方法签名,我们定义接口Methods,它的内容如下:/** * -
JavaScript与java语言的区别
java和JavaScript是两个不同的语言。那么这两个语言有什么不同呢?下面是小编为大家整理的JavaScript与java语言的区别,欢迎参考~ 1 语言特点:1.1 弱类型:JavaScript在变量声明的时候并不严格区分数据类型,(var 变量名) -
Javascript和Java语言间的异同比较
总结是在某一特定时间段对学习和工作生活或其完成情况,包括取得的成绩、存在的问题及得到的经验和教训加以回顾和分析的书面材料,通过它可以正确认识以往学习和工作中的优缺点,因此好好准备一份总结吧。我们该怎么写总结 -
Java与JavaScript的区别
因为名字的关系,总是有人误以为Javascript是Java的一个子集,或者必然会存在一些关系。下面小编给大家介绍Java与JavaScript的区别,欢迎阅读!什么是Javascript?Javascript是运行在浏览器中的一种脚本语言,在web页面中,Javas