1.动态语言与鸭子类型(js语言能轻松实现面向接口编程,而不是实现编程)
- 动态语言:编译的时候不关注数据类型,编译时没有类型检查的过程,运行的时候根据被赋予的数值来决定类型
2)鸭子类型:只关注对象行为,不关注对象本身 - 因此js在实现多态的时候并不需要出现向上转型
代码示例
var duck = {
singFun:function(){
console.log("gagaga")
}
}
var chicken = {
singFun:function(){
console.log("gagaga")
}
}
var choir = [];
var joinChoir = function(animal){
if(animal & typeof animal.singFun === 'function'){
choir.push(animal);
}
}
joinChoir(duck)
joinChoir(chicken) //无需关心鸡是否属于鸭子类型,只要有singFun行为就能加入合唱团
2.多态:将做什么 和 谁去做以及怎样做 分离开来, 将不变的事物 与 可能改变的事务分离
代码示例
function sound(animal){
if(animal instanceof Duck){
console.log("'gagaga")
}else if(animal instanceof Chicken){
console.log("zhizhizhi")
}
}
sound(duck);
sound(chicken)
//分析:叫是不变的行为,可变的是 谁去叫以及怎样叫,倘若来一只狗,上面的代码则还要加入一个判断狗,下面为优化
function sound(animal){
animal.sound()
}
var chicken = {
sound:function(){
console.log("zhizhizhi")
}
}
var chicken = {
sound:function(){
console.log("gagaga")
}
}
sound(chicken)
sound(duck)
3.封装:封装的目的是将信息隐藏
1)封装数据:在许多语言的对象系统中,封装数据是由语法解析来实现的,这些语言也许提供了private、public、protected等关键字来提供不同的访问权限(js没有,依赖变量作用域来实现封装的特性并且只能模拟public和private两种封装特性)
代码实现
//除了let
var obj = (function(){
var _name = "hahaha";
return{
getName : function(){
return _name
}
}
})()
4.原型模式(在以类为中心的面向对象编程语言中,类和对象的关系可以想象成铸模和铸件的关系,对象总是从类中创建而来,而在原型编程思想中,类并不是必须的,对象未必需要从类中创建而来,一个对象是通过克隆另外一个对象得到的)
代码实现
//如果A对象是从B对象克隆而来,那么B对象则是A对象的原型,则从A到B形成了一条原型链,当我们在A 中找不到这个方法的时候就会把这个请求委托给B,这样一来便实现了继承的效果
var p = {
name:"hahaha"
}
var p1 = Object.create(p)
p1.__proto__ === p
var a1 = new Object();
var a2 = {};
console.log(a1.__proto__ === Object.prototype,a1.__proto__ === Object.prototype) //true
//总结:所有的数据都是对象,要得到一个对象不是通过实例化类,而是找到一个对象作为原型并克隆它
网友评论