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