<!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. 23 DesignPatterns学习笔记:C++语言实现 --- 1.1 Factory

    23 DesignPatterns学习笔记:C++语言实现 --- 1.1 Factory 2016-07-18 13:03:43 模式理解

  2. Android-UIUtils-工具类

    UIUtils工具类,主要是处理和Activity有关,和界面显示层有关的公共方法: package common.library.utils; import android.app.Activity ...

  3. Hibernate实体类注解的问题

    刚刚和八千哥弄一个问题,这个很诡异的问题,困扰了我这么长时间.哎,说来惭愧. 用三大框架写毕设,结果今天获取前台数的时候,发现传值有个传不到. 我一开始用的是名为cows的数据,后来换了个数据库,加了 ...

  4. 使用testNGListenter来自定义日志

    背景 用testNG写用例的时候,只是打印了请求的日志,没有打印这个用例的开始和结束的标识,想加上这个标识这样更好的排查问题 这种日志是加在用例开始执行和结束,相当于spring中的AOP功能,今天翻 ...

  5. 查看JVM

    通过jconsole.exe来查看,jconsole.exe所在目录为/%JAVA_HOME%/bin/jconsole.exe   需要配置: -Dcom.sun.management.jmxrem ...

  6. Session如何保存在sql数据库中

    aspnet中,session默认以inproc模式存储,也就是保存在iis进程中,这样有个优点就是效率高,但不利于为本负载均衡扩展.可以把session信息保存在SQL Server中,据说,该种方 ...

  7. C语言/C++编程学习:不做C/C++工作也要学C/C++的原因!

    C语言是面向过程的,而C++是面向对象的 C和C++的区别: C是一个结构化语言,它的重点在于算法和数据结构.C程序的设计首要考虑的是如何通过一个过程,对输入(或环境条件)进行运算处理得到输出(或实现 ...

  8. HTML5 SSE 数据推送应用开发

    javascript表达行为,css表达外观,注意HTML既表达结构(逻辑结构),又表达内容(数据本身)通常需要更新数据时,并不需要更新结构,正是这种不改变组织结构仅改变数据的诉求,推动了数据拉取和数 ...

  9. Message Loop 原理及应用

    此文已由作者王荣涛授权网易云社区发布. 欢迎访问网易云社区,了解更多网易技术产品运营经验. Message loop,即消息循环,在不同系统或者机制下叫法也不尽相同,有被叫做event loop,也有 ...

  10. Delphi中MessageBox用法

    消息框是个很常用的控件,属性比较多,本文列出了它的一些常用方法,及指出了它的一些应用场合. 1.最简单用法,不带图形 MessageBox(0,'不同意','提示',MB_OK); MessageBo ...