<!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. 更改mysql默认字符集 (转载)

    1. service mysqld stop,停用mysql. 2. cp /etc/my.cnf /etc/my.cnf.bak,修改前做备份,这是个好习惯. 修改my.cnfvi /etc/my. ...

  2. [leetcode] 8. Maximum Depth of Binary Tree

    可能是因为我是按难度顺序刷的原因,这个其实在之前的几道题里面已经写过了.题目如下: Given a binary tree, find its maximum depth. The maximum d ...

  3. Android-FileUtils工具类

    文件相关工具类 public final class FileUtils { private FileUtils() { throw new UnsupportedOperationException ...

  4. Android-openFileInput openFileOutput

    Android设计了一套可以操作自身APP目录文件对API openFileInput openFileOutput,读取只需传入文件名,写入需要传入文件名 与 权限模式 界面: 布局代码: < ...

  5. mysql快速插入大数据

    说的是插入数据,这个倒像是载入数据. 上一篇,是按照插入数据来写的,就是insert into,当时插入一万条实在是太慢了,大概是286734毫秒. insert into table values, ...

  6. Cockroachdb 四、用户管理及授权

    四 用户管理及授权 用户管理 简介# Create a user:cockroach user set <username> <flags> # List all users: ...

  7. solr-DIH:定时增量索引

    参考:官方文档,http://wiki.apache.org/solr/DataImportHandler#Scheduling googlecode 找到:https://code.google.c ...

  8. AutoMapper之如何开始,适合入门和演示

    原来想应该介绍下背景说明下好处什么的,仔细想都是废话 ,直接上代码吧. 首先有两个类,一个是和数据库对应的实体 Student,一个是和页面展示相关的页面模型 StudentModel. /// &l ...

  9. RabbitMq初探——消息均发

    消息均发 前言 由前文 RabbitMq初探——消息分发 可知,rabbitmq自带分发机制——消息会按顺序的投放到该队列下的多个消费者,例如1,3,5投放消费者C1,2,4,6投放消费者C2. 这就 ...

  10. http协议与https协议的区别

    1.前言 超文本传输协议HTTP协议被用于在Web浏览器和网站服务器之间传递信息,HTTP协议以明文方式发送内容,不提供任何方式的数据加密,如果攻击者截取了Web浏览器和网站服务器之间的传输报文,就可 ...