设计模式之---多态、封装、继承

多态

多态背后的思想是将“做什么”和“谁去做以及怎样去做”分离开来。把不变的部分隔离出来,把可变的部分封装起来。多态最根本的好处是你不必向对象询问“你是什么类型”,只管调动对象的行为。
var makeSound = function (animal) {
    animal.sound();
}
var Duck = function () {};
Duck.prototype.sound = function () {
    console.log("嘎嘎嘎");
}
var Chicken = function () {}
Chicken.prototype.sound = function () {
    console.log("咯咯咯");
}
makeSound(new Duck());
makeSound(new Chicken());
静态语言面向对象的设计思路通常是向上转型,将Duck和Chicken抽象抽Animal类,在Animal类中定义发声方法。而javascript是动态语言,不会在编译时检查类型,不需要向上转型。下面的例子把动物发出叫声的方法抽象出来。

封装

通过封变化的方式,把系统中稳定不变的部分和容易变化的部分隔离开来,在系统的演变过程中,我们只需要替换那些容易变化的部分。

基于原型的继承

ECMAScript5提供了Object.create来克隆对象
    var Plane = function () {
        this.blood = 100;
        this.attackLevel = 1;
    }
    var plane = new Plane();
    plane.blood = 500;
    plane.attackLevel = 10;
    var clonePlane = Object.create( plane );

    Object.create = Object.create || function (obj) {
        var F = function () {}
        F.prototype = obj;
        return new F();
    }
原型特性:1.当对象无法响应某个请求时,会把该请求委托给它自己的原型。
        2.对象会记住它的原型 __proto__指向原型。
        3.所有数据都是对象

javascript中的根对象是Object.prototype,我们遇到的对象都是由Object.prototype克隆而来的。
console.log(Object.getPrototypeOf(obj) === Object.prototype) //true
b沿着原型链找name
var A = function () {}
A.prototype = { name : 'seven'}

var B = function () {}
B.prototype = new A();

var b = new B();
console.log( b.name )
Es6引入类的概念
class Animal {
    constructor(name){
        this.name = name;
    }
    getName(){
        return this.name;
    }
}
class Dog extends Animal{
    constructor(name){
        super(name);
    }
    speak(){
        return "woof"
    }
}
var dog = new Dog("Scamp");
console.log(dog.getName() + "says"+ dog.speak());
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值