<!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.封装的更多相关文章

  1. JavaScript设计模式之一封装

    对于熟悉C#和Java的兄弟们,面向对象的三大思想(封装,继承,多态)肯定是了解的,今天我想讲讲如何在Javascript中利用封装这个特性,开讲! 我们会把现实中的一些事物抽象成一个Class并且把 ...

  2. 《JavaScript设计模式 张》整理

    最近在研读另外一本关于设计模式的书<JavaScript设计模式>,这本书中描述了更多的设计模式. 一.创建型设计模式 包括简单工厂.工厂方法.抽象工厂.建造者.原型和单例模式. 1)简单 ...

  3. 《JavaScript设计模式与开发实践》整理

    最近在研读一本书<JavaScript设计模式与开发实践>,进阶用的. 一.高阶函数 高阶函数是指至少满足下列条件之一的函数. 1. 函数可以作为参数被传递. 2. 函数可以作为返回值输出 ...

  4. Javascript设计模式学习一

    学习Javascript设计模式之前,需要先了解一些相关知识,面向对象的基础知识.this等重要概念,以及掌握一些函数式编程的技巧. Js多态 多态的思想:实际上是把“做什么”和“谁去做”分离开来.例 ...

  5. 常用的Javascript设计模式

    <parctical common lisp>的作者曾说,如果你需要一种模式,那一定是哪里出了问题.他所说的问题是指因为语言的天生缺陷,不得不去寻求和总结一种通用的解决方案. 不管是弱类型 ...

  6. JavaScript设计模式学习笔记

    1 JavaScript设计模式深入分析 私有属性和方法:函数有作用域,在函数内用var 关键字声明的变量在外部无法访问,私有属性和方法本质就是你希望在对象外部无法访问的变量. 特权属性和方法:创建属 ...

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

    该篇随我读书的进度持续更新阅读书目:<JavaScript设计模式> 2016/3/30 2016/3/31 2016/4/8 2016/3/30: 模式是一种可复用的解决方案,可用于解决 ...

  8. JavaScript的学习--JavaScript设计模式的总结

    这篇博客只是自己对设计模式的理解的备忘~ 看完了<JavaScript设计模式>这本书,一直没有写博客记录一下,最近抽出时间来重读了一下,就顺便记录一下~ 如果你只是想粗略了解一下Java ...

  9. JavaScript设计模式 - 迭代器模式

    迭代器模式是指提供一种方法顺序访问一个聚合对象中的各个元素,而又不需要暴露该对象的内部表示. 迭代器模式可以把迭代的过程从业务逻辑中分离出来,在使用迭代器模式之后,即使不关心对象的内部构造,也可以按顺 ...

随机推荐

  1. [label][JavaScript][The Defined Guide of JavaScript] 变量的作用域

    变量的作用域 一个变量的作用域(scope)是程序中定义这个变量的区域. 全局(global)变量的作用域(scope)是全局性的,即在JavaScript代码中,它处处都有定义.    而在函数之内 ...

  2. 使用pscp/pslurp批量并发分发/回收文件

    pssh pssh -h ip文件 本地文件 远程目录或文件 pslurp pslurp -h ip文件 -L 本地目录 远程文件 本地文件名称

  3. ubuntu设置root

    第一步:首先sudo passwd root 设置root密码第二步:#vim /etc/ssh/sshd_config#PermitRootLogin without-password    #找到 ...

  4. mysql--mysql的安装与目录介绍

    一.mysql的下载安装 1.下载安装 1.windows10下安装 我们采用绿色免安装版, 打开你的mysql文件夹中的bin目录,我的是这个样子的 将这个路径添加入系统环境变量,首先右键此电脑-- ...

  5. 【ocp-12c】最新Oracle OCP-071考试题库(47题)

    47.(10-6)choose two You need to calculate the number of days from 1st January 2007 till date. Dates ...

  6. CSS3-渐变这个属性2

    渐变 有了渐变再也不用去切1px的图再重复了.. -webkit- 是浏览器前缀, 表示特定浏览器对一个属性还在实验阶段, 在这里顺便写下各个浏览器的前缀: chrome/ safari     -w ...

  7. 利用C# CefSharp Python采集某网站简历并自动发送邀请短信

    以往爬虫没怎么研究过,最近有个需求,要从某网站采集敏感信息,稍稍考虑了一下,决定利用C# Winform和Python一起来解决这个事件. 整个解决方案不复杂:C#编写WinForm窗体,进行数据分析 ...

  8. 【文文殿下】[BZOJ4327] JSOI2012 玄武密码

    SAM裸题.这道题卡空间.要小心数组别开炸了. #include<cstdio> #include<cstring> typedef long long ll; const i ...

  9. 教你玩转XSS漏洞

    什么是存储性XSS那? 通俗理解就是”xss“语句存在服务器上,可以一直被客户端浏览使用,所有登陆某一个存在”存储性xss“的页面的人,都会中招,可以是管理员,可以是普通的用户,所以他的危害是持续性的 ...

  10. Redis存储

    redis库提供了两个类:Redis和StrictRedis来实现Redis的命令操作,前者是为了兼容老版本库的集中方法,一般就用StrictRedis 一. redis基本操作 . 设置redis密 ...