JavaScript设计模式-6.封装

  1 <!DOCTYPE html>
  2 <html>
  3     <head>
  4         <meta charset="UTF-8">
  5         <title>javascript高级语法6-封装</title>
  6     </head>
  7     <body>
  8         <script>
  9         /*
 10          * 信息的隐藏是最终的目的,封装只不过是隐藏的一种方法
 11          */
 12
 13         function demo1(){
 14         (function(){
 15             /*类的定义形式:
 16              * 1.门户大开类型
 17              * 2.命名规范区别私有和公有方式
 18              * 3.闭包
 19              */
 20
 21             //门户大开型
 22             function Person(age,name){
 23                 this.name = name;
 24                 if(!this.checkAge(age)){
 25                     throw new Error("年龄必须在0-150之间")
 26                 }
 27                 this.age = age;
 28             }
 29 //            var p = new Person(-10,"jim");
 30     //        alert(p.name+"  "+p.age); //年龄-10,不符合常规
 31             //解决上述问题
 32             Person.prototype = {
 33                 checkAge:function(age){
 34                     if(age>=0 && age<150){
 35                         return true
 36                     }else{
 37                         return false;
 38                     }
 39                 }
 40             };
 41             Person.prototype["getName"] = function(){
 42                 return this.name || "javascript.com"
 43             }
 44 //            var p = new Person(-10,"jim");
 45 //            alert(p.name+"  "+p.age);
 46             //读取规则的验证
 47             var p2 = new Person(27);
 48             alert(p2.getName()+"  "+p2.age);
 49
 50         })()
 51         }
 52
 53         //用命名规范来区别私有和公有变量
 54         function demo2(){
 55         (function(){
 56             function Person(name,age,email){
 57                 //定义私有变量
 58                 this._name;
 59                 this._age;
 60                 this.setName(name);
 61                 this.setAge(age);
 62                 this.emial = email;
 63
 64             }
 65             Person.prototype = {
 66                 setName:function(name){
 67                     this._name = name;
 68                 },
 69                 setAge:function(age){
 70
 71                     if(age>=0 && age<150){
 72                         this._age = age;
 73                     }else{
 74                         throw new Error("年龄必须在0-150之间")
 75                     }
 76                 }
 77             };
 78
 79             var p = new Person("jim",1,"张丹");
 80
 81         })();
 82         }
 83
 84         //闭包实现封装
 85         function demo3(){
 86         (function(){
 87             function Person(name,age,email,sex){
 88                 this.email = email;
 89                 //get
 90                 this.getName = function(){
 91                     return this.name;
 92                 }
 93                 this.getAge = function(){
 94                     return this.age;
 95                 }
 96
 97                 //set
 98                 this.setName = function(name){
 99                     this.name = name;
100                 }
101                 this.setAge = function(age){
102                     if(age>=0 && age<150){
103                         this.age = age;
104                     }else{
105                         throw new Error("年龄必须在0-150之间")
106                     }
107                 };
108
109                 var _sex="M"; //这也是私有变量的编写方式
110                 this.getSex = function(){
111                     return _sex;
112                 }
113                 this.setSex = function(sex){
114                     _sex = sex;
115                 }
116                 this.init = function(){
117                     this.setName(name);
118                     this.setAge(age);
119                 }
120                 this.init();
121
122             }
123             var p = new Person("jim",-1,"[email protected]")
124         })();
125         }
126
127         //静态化
128         (function(){
129             /*
130              * 普通的属性和函数是作用在对象上的
131              * 静态函数是定义到类上的
132              */
133
134             function Person(name,age){
135                 this.name = name;
136                 this.showName = function(){
137                     alert(this.name);
138                 }
139             }
140             //第一种静态函数的写法
141             Person.add = function(x,y){
142                 return x+y
143             }
144             //alert(Person.add(1,3))
145
146             //第二种方式:用类中类的方式完成每一个对象全拥有相同的属性和函数
147             var cat = (function(){
148                 //私有静态属性
149                 var AGE = 10;
150                 //私有函数
151                 function add(x,y){
152                     return x+y
153                 }
154                 return function(){
155                     this.AGE = AGE;
156                     this.add = function(x,y){
157                         return add(x,y);
158                     }
159                     this.setAge = function(age){
160                         AGE = age;//这个可以设置成功,但只对以后创建实例的初始化有效。
161                     }
162                 }
163             })()
164
165             alert(new cat().add(1,2)+"  "+new cat().AGE);
166             new cat().setAge(20); //这个可以设置成功,但只对以后创建实例的初始化有效。
167             alert(new cat().AGE);
168         })();
169
170         /*
171          * 1.保护内部数据的完整性是封装一大用处
172          * 2.对象的重构变得很轻松,(可以动态化变更部分代码)
173          * 3.弱化模块之间的耦合。
174          * 弊端:私有的方法会变得很难进行单元测试,使用封装就意味着与复杂的代码打交道。
175          * 最大的问题:封装在javascript是很难实现的。
176          */
177         </script>
178     </body>
179 </html>
时间: 2025-01-13 17:30:25

JavaScript设计模式-6.封装的相关文章

JavaScript设计模式 - 迭代器模式

迭代器模式是指提供一种方法顺序访问一个聚合对象中的各个元素,而又不需要暴露该对象的内部表示. 迭代器模式可以把迭代的过程从业务逻辑中分离出来,在使用迭代器模式之后,即使不关心对象的内部构造,也可以按顺序访问其中的每个元素 许多浏览器都支持 Javascript 的 Array.prototype.forEach 迭代器可以分为 内部迭代器 和 外部迭代器 一.jQuery 中的迭代器 1 $.each( [1,2,3,4], function (i, n) { 2 console.log( "当

javascript设计模式详解之命令模式

每种设计模式的出现都是为了弥补语言在某方面的不足,解决特定环境下的问题.思想是相通的.只不过不同的设计语言有其特定的实现.对javascript这种动态语言来说,弱类型的特性,与生俱来的多态性,导致某些设计模式不自觉的我们都在使用.只不过没有对应起来罢了.本文就力求以精简的语言去介绍下设计模式这个高大上的概念.相信会在看完某个设计模式之后有原来如此的感慨. 一.基本概念与使用场景: 基本概念: 将请求封装成对象,分离命令接受者和发起者之间的耦合. 命令执行之前在执行对象中传入接受者.主要目的相互

javascript设计模式

javascript设计模式 阅读目录 什么是设计模式 单体模式: 工厂模式: 单例模式 观察者模式(发布订阅模式) 策略模式 模板模式 代理模式 外观模式 设计模式太多了,貌似有23种,其实我们在平时的工作中没有必要特意去用什么样的设计模式,或者你在不经意间就已经用了设计模式当中的一种.本文旨在总结平时相对来说用的比较多的设计模式. 回到顶部 什么是设计模式 百度百科: 设计模式(Design pattern)是一套被反复使用.多数人知晓的.经过分类编目的.代码设计经验的总结. 使用设计模式是

《JavaScript设计模式 张》整理

最近在研读另外一本关于设计模式的书<JavaScript设计模式>,这本书中描述了更多的设计模式. 一.创建型设计模式 包括简单工厂.工厂方法.抽象工厂.建造者.原型和单例模式. 1)简单工厂 又叫静态工厂方法,由一个工厂对象决定创建某一种产品对象类的实例. 两种实现方式,第一种是通过类实例化对象创建,第二种是创建一个新对象然后包装增强其属性和功能. demo代码. 2)工厂方法 通过对产品类的抽象使其创建业务主要负责用于创建多类产品的实例. 将工厂方法看作是一个实例化对象的工厂类. demo

【Javascript设计模式】第一课 Javascript中的继承

在Javascript中每个类有三个部分:     1.第一部分是构造函数内,这是供实例化对象复制用的. 2.第二部分是构造函数外,通过点语法添加的,这是供类使用的,实例化对象是访问不到的. 3.第三部分是类的原型中,实例化对象可以通过其原型链间接访问到,也是为供所有实例化对象所共用的. 一. 子类的原型对象 --类式继承 类式继承是最常见最简单的继承模式,类式继承用一句话概括就是"父类实例指向子类原型" /** * 声明一个父类 * @constructor */ var Super

JavaScript设计模式:读书笔记(未完)

该篇随我读书的进度持续更新阅读书目:<JavaScript设计模式> 2016/3/30 2016/3/31 2016/3/30: 模式是一种可复用的解决方案,可用于解决软件设计中遇到的常见问题./将解决问题的方法制作成模板,并且这些模板可应用于多种不同的情况.有效模式的附加要求:适合性,实用性,适用性. 模式的优点: 防止局部问题引起大问题,模式让我们的代码更有组织性 模式通常是通用的解决方式,不管我们开发哪种应用程序,都可以用模式优化我们代码的结构 模式确实可以让我们避免代码复用,使代码更

【读书】JavaScript 设计模式与开发实践

2016.08.30 <JavaScript 设计模式与开发实践> 曾探 人民邮电出版社 2016年5月第1版 p13 找到变化的部分并封装之,以使得容易替换:而剩下的就是不变的部分. P49 函数柯里化(currying)的作用是多次收集参数,然后作为数组传给处理函数再一次执行. 其意义在于预处理--将预处理的流程放到一个函数里会更为清晰可控. P57 惰性加载函数 在函数内部重写引用函数的外部变量的引用,从而在第一次"调用"此变量后,此变量就指向新的正确的函数. p84

常用的Javascript设计模式-韩烨

<Practical Common Lisp>的作者 Peter Seibel 曾说,如果你需要一种模式,那一定是哪里出了问题.他所说的问题是指因为语言的天生缺陷,不得不去寻求和总结一种通用的解决方案. 不管是弱类型或强类型,静态或动态语言,命令式或说明式语言.每种语言都有天生的优缺点.一个牙买加运动员, 在短跑甚至拳击方面有一些优势,在练瑜伽上就欠缺一些. 术士和暗影牧师很容易成为一个出色的辅助,而一个背着梅肯满地图飞的敌法就会略显尴尬. 换到程序中, 静态语言里可能需要花很多功夫来实现装饰

Javascript设计模式学习一

学习Javascript设计模式之前,需要先了解一些相关知识,面向对象的基础知识.this等重要概念,以及掌握一些函数式编程的技巧. Js多态 多态的思想:实际上是把“做什么”和“谁去做”分离开来.例: var makeSound = function(animal){ if(animal.show instanceof Function){ animal.show(); } } var dog = { show: function(){ console.log('汪汪'); } } var c