封装
前言:封装的目的是将信息隐藏。一般来说我们讨论的封装都是封装数据和封装实现。这篇文章我们将讨论更广义的封装。
1、封装数据:
js只能够依赖变量的作用域来实现封装
var myObject = function(){
var _name = "sven";
return{
getName:function(){
return _name;
}
}
}
console.log(myObject.getName()); //输出sven
console.log(myObject._name); //输出undefined
我们通过函数作用域 将_name变量 包裹
并且通过return将 方法公开 这样就可以通过 myObject.getName() 访问到变量 _name了
这是对数据的一种保护,但是封装不等同于封装数据。封装的目的是将信息隐藏,所以从广义上讲,封装还可以封装实现细节、设计细节以及隐藏对象的类型等。
封装有神魔好处类:
封装使得对象之间的耦合便松散,对象之间通过暴露API接口来实现通信。
2、封装类型
晃点你们的 封装确实有封装类型的概念 那是相对于静态类型语言来说的 但是js是一门类型模糊的语言,在封装类型这一方面js是没有能力的。
3、封装变化
从设计模式的角度上来说,封装的更重要的层次体现为封装变化。。。
通过封装变化的方式,把系统中稳定不变的部分和容易变化的部分隔离出,在系统演变的过程中,我门只需要改变容易变化的部分,如果这些部分是已经封装好的,替换起来也相对容易。这可以对大程度的保证程序的稳定性和可扩展性。
原型模式和原型继承
从这里开始我们就 正式介绍第一个设计模式 ——-原型模式:
1、使用克隆的原型模式:
逃出克隆岛 这部电影不知道大家看过没有 还是蛮有意思的推荐看一看
如果我们玩一款忍者游戏,忍者会分身,当忍者没有血了想着分身逃跑时,分身的血量状态等一定要和真身的一样,不然就让敌人分辨出来了。
如果使用原型模式来实现,只需要调用负责克隆的方法clone,便能完成同样的功能
var Renzhe = function(){
this.blood = 100;
this.attackLevel = 1;
this.defenseLevel = 1;
};
var renzhe = new Renzhe();
renzhe.blood = 200;
renzhe.attackLevel = 2;
renzhe.defenseLevel = 2;
var clonerenzhe = Object.create(renzhe);
console.log(clonerenzhe );//Object{blood:200,renzhe.attackLevel = 2;renzhe.defenseLevel = 2;}
Object.create方法是ES5提供的可以用来克隆对象的。
克隆只是创建对象的手段,但是实际应用中我们可能并不想得到一个一抹一样的对象,而是通过一种便捷的方式去创建某个类型的对象。
2、原型编程规范的一些规则。
原型链是很有用处的,我们体验下Io语言就知道了:
Io语言是一门基于原型的语言,Io语言没有类的概念,每一个对象都是基于另外一个对象的克隆。
Animal :=Object clone //现在通过克隆对象Object得到了新的Animal对象
Animal maskSound :=method("animal maskSound" print);//让所有的动物都会叫
Dog := Animal clone //所有动物都会叫了 在创建个狗
Dog eat = method(" dog eat " print); //让狗能吃东西
现在 我们已经搭建好了一个动物世界
愈发的感觉自己像个上帝 啊
接下啦我们调用:::
Animal makeSound //输出animal makeSound
Dog eat //输出dog eat
在上面的例子中,object是Animal的原型对象,Animal是Dog的原型对象,这就形成了一个原型链。
这时,在Io的解释器中执行Dog makeSound时,Dog对象并没有makeSound方法,于是把请求委托给了他的原型Animal,Animal是有这个方法的,所以这条语句能顺利输出,这里就偷懒不写了。
在原型编程中一个重要的特性就是,当当前对象无法响应某个请求时,会把该请求委托给他自己的原型
前方高能预警————–=================我就是图片================
由上可以知晓,原型编程泛型应该具有一下的几种基本规则:
- 所有数据都是对象
- 要得到一个对象,不是通过实例化类,而是通过找到一个对象作为原型并克隆他
- 对象会记住他的原型
- 如果对象无法响应某个请求,他会把这个请求委托给自己的原型
js中的原型继承—–回见
感谢《JavaScript设计模式与开发实践》一书提供的知识
我不是巨人,我只是站在了巨人的肩膀上
人之所以人小是因为还有缺陷,之所以又变得强大,是因为克服了自己的缺陷 ———《蛀牙》