JavaScript设计模式-6.封装
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>javascript高级语法6-封装</title>
</head>
<body>
<script>
/*
* 信息的隐藏是最终的目的,封装只不过是隐藏的一种方法
*/ function demo1(){
(function(){
/*类的定义形式:
* 1.门户大开类型
* 2.命名规范区别私有和公有方式
* 3.闭包
*/ //门户大开型
function Person(age,name){
this.name = name;
if(!this.checkAge(age)){
throw new Error("年龄必须在0-150之间")
}
this.age = age;
}
// var p = new Person(-10,"jim");
// alert(p.name+" "+p.age); //年龄-10,不符合常规
//解决上述问题
Person.prototype = {
checkAge:function(age){
if(age>=0 && age<150){
return true
}else{
return false;
}
}
};
Person.prototype["getName"] = function(){
return this.name || "javascript.com"
}
// var p = new Person(-10,"jim");
// alert(p.name+" "+p.age);
//读取规则的验证
var p2 = new Person(27);
alert(p2.getName()+" "+p2.age); })()
} //用命名规范来区别私有和公有变量
function demo2(){
(function(){
function Person(name,age,email){
//定义私有变量
this._name;
this._age;
this.setName(name);
this.setAge(age);
this.emial = email; }
Person.prototype = {
setName:function(name){
this._name = name;
},
setAge:function(age){ if(age>=0 && age<150){
this._age = age;
}else{
throw new Error("年龄必须在0-150之间")
}
}
}; var p = new Person("jim",1,"张丹"); })();
} //闭包实现封装
function demo3(){
(function(){
function Person(name,age,email,sex){
this.email = email;
//get
this.getName = function(){
return this.name;
}
this.getAge = function(){
return this.age;
} //set
this.setName = function(name){
this.name = name;
}
this.setAge = function(age){
if(age>=0 && age<150){
this.age = age;
}else{
throw new Error("年龄必须在0-150之间")
}
}; var _sex="M"; //这也是私有变量的编写方式
this.getSex = function(){
return _sex;
}
this.setSex = function(sex){
_sex = sex;
}
this.init = function(){
this.setName(name);
this.setAge(age);
}
this.init(); }
var p = new Person("jim",-1,"xxxx@qq.com")
})();
} //静态化
(function(){
/*
* 普通的属性和函数是作用在对象上的
* 静态函数是定义到类上的
*/ function Person(name,age){
this.name = name;
this.showName = function(){
alert(this.name);
}
}
//第一种静态函数的写法
Person.add = function(x,y){
return x+y
}
//alert(Person.add(1,3)) //第二种方式:用类中类的方式完成每一个对象全拥有相同的属性和函数
var cat = (function(){
//私有静态属性
var AGE = 10;
//私有函数
function add(x,y){
return x+y
}
return function(){
this.AGE = AGE;
this.add = function(x,y){
return add(x,y);
}
this.setAge = function(age){
AGE = age;//这个可以设置成功,但只对以后创建实例的初始化有效。
}
}
})() alert(new cat().add(1,2)+" "+new cat().AGE);
new cat().setAge(20); //这个可以设置成功,但只对以后创建实例的初始化有效。
alert(new cat().AGE);
})(); /*
* 1.保护内部数据的完整性是封装一大用处
* 2.对象的重构变得很轻松,(可以动态化变更部分代码)
* 3.弱化模块之间的耦合。
* 弊端:私有的方法会变得很难进行单元测试,使用封装就意味着与复杂的代码打交道。
* 最大的问题:封装在javascript是很难实现的。
*/
</script>
</body>
</html>
JavaScript设计模式-6.封装的更多相关文章
- JavaScript设计模式之一封装
对于熟悉C#和Java的兄弟们,面向对象的三大思想(封装,继承,多态)肯定是了解的,今天我想讲讲如何在Javascript中利用封装这个特性,开讲! 我们会把现实中的一些事物抽象成一个Class并且把 ...
- 《JavaScript设计模式 张》整理
最近在研读另外一本关于设计模式的书<JavaScript设计模式>,这本书中描述了更多的设计模式. 一.创建型设计模式 包括简单工厂.工厂方法.抽象工厂.建造者.原型和单例模式. 1)简单 ...
- 《JavaScript设计模式与开发实践》整理
最近在研读一本书<JavaScript设计模式与开发实践>,进阶用的. 一.高阶函数 高阶函数是指至少满足下列条件之一的函数. 1. 函数可以作为参数被传递. 2. 函数可以作为返回值输出 ...
- Javascript设计模式学习一
学习Javascript设计模式之前,需要先了解一些相关知识,面向对象的基础知识.this等重要概念,以及掌握一些函数式编程的技巧. Js多态 多态的思想:实际上是把“做什么”和“谁去做”分离开来.例 ...
- 常用的Javascript设计模式
<parctical common lisp>的作者曾说,如果你需要一种模式,那一定是哪里出了问题.他所说的问题是指因为语言的天生缺陷,不得不去寻求和总结一种通用的解决方案. 不管是弱类型 ...
- JavaScript设计模式学习笔记
1 JavaScript设计模式深入分析 私有属性和方法:函数有作用域,在函数内用var 关键字声明的变量在外部无法访问,私有属性和方法本质就是你希望在对象外部无法访问的变量. 特权属性和方法:创建属 ...
- JavaScript设计模式:读书笔记(未完)
该篇随我读书的进度持续更新阅读书目:<JavaScript设计模式> 2016/3/30 2016/3/31 2016/4/8 2016/3/30: 模式是一种可复用的解决方案,可用于解决 ...
- JavaScript的学习--JavaScript设计模式的总结
这篇博客只是自己对设计模式的理解的备忘~ 看完了<JavaScript设计模式>这本书,一直没有写博客记录一下,最近抽出时间来重读了一下,就顺便记录一下~ 如果你只是想粗略了解一下Java ...
- JavaScript设计模式 - 迭代器模式
迭代器模式是指提供一种方法顺序访问一个聚合对象中的各个元素,而又不需要暴露该对象的内部表示. 迭代器模式可以把迭代的过程从业务逻辑中分离出来,在使用迭代器模式之后,即使不关心对象的内部构造,也可以按顺 ...
随机推荐
- Poj2231 Moo Volume 2017-03-11 22:58 30人阅读 评论(0) 收藏
Moo Volume Time Limit: 1000MS Memory Limit: 65536K Total Submissions: 22104 Accepted: 6692 Descr ...
- Cenots 7 Configure static IP
For example: # cd /etc/sysconfig/ifcfg-enp3s0 # cat ifcfg-enp3s0 TYPE=EthernetBOOTPROTO=staticIPADDR ...
- JavaScript日期(参考资料)
构造函数1.new Date() 如果没有参数,则Date的构造器会依据系统设置的当前时间来创建一个Date对象.2.new Date(value) value代表自1970年1月1日00:00:00 ...
- ASP.NET Core IdentityServer4 新手上路
OAuth2.0资料 今天看到一篇博主写了该系列文章,贴图和过程都比较详细,俗话说实践是检验真理的唯一标准(如果是按照参考文章复制粘贴,应该不会出现踩坑,但是我喜欢自己手动敲一遍),发现几个坑,因而总 ...
- WCF快速上手(二)
服务端是CS程序,客户端(调用者)是BS程序 一.代码结构: 二.服务接口Contract和实体类Domain INoticeService: using Domain; using System; ...
- HBase - 数据写入流程解析
本文由 网易云发布. 作者:范欣欣 本篇文章仅限内部分享,如需转载,请联系网易获取授权. 众所周知,HBase默认适用于写多读少的应用,正是依赖于它相当出色的写入性能:一个100台RS的集群可以轻松 ...
- TestNG参数化之@DataProvider传参
@parameters适合传递简单少量参数,复杂参数一般使用@DataProvider传递 @DataProvider语法: @DataProvider(name = "dataprovid ...
- Android Studio如何用真机调试
1,在真机中设置USB调试模式打开,具体:“设置”->“应用程序”->“开发”->“USB调试”. 2,安装安卓的USB驱动,如果按照不好,那么去下载一个豌豆荚,它会帮你正确安装你的 ...
- Unity下的开发框架--适应web和微端游戏异步资源请求的框架
一. 内容简介: 1. 框架对Web与微端游戏特性的支持: Web和微端游戏最重要的特性是,资源是持续从服务器上即时下载下来的.而保证体验流畅的关键就是保证资源下载分散到持续的体验过程中,并保 ...
- 【Oracle 12c】最新CUUG OCP-071考试题库(57题)
57.(14-17) choose two: Examine the structure of the DEPARTMENTS table You execute the following comm ...