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

来源:互联网 发布:淘宝天猫电器城 编辑:程序博客网 时间:2024/06/03 05:59

多态

多态背后的思想是将“做什么”和“谁去做以及怎样去做”分离开来。把不变的部分隔离出来,把可变的部分封装起来。多态最根本的好处是你不必向对象询问“你是什么类型”,只管调动对象的行为。
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());
原创粉丝点击