1、instanceof 用来判断一个构造函数的prototype属性所指向的对象是否存在在另外一个要检测对象的原型链
上
第一章、
1.2.1 多态
一段多态js代码
let makeSound = function(animal){
if(animal instanceof Duck){
console.log('嘎嘎嘎')
}else if(animal instalceof Chicken){
console.log('咯咯咯')
}
}
let Duck = function(){}
let Chicken = function(){}
makeSound(new Duck())
//
嘎嘎嘎
makeSound(new Chicken())
//
咯咯咯
这段代码确实体现了“多态性”,当我们分别向鸭和鸡发出“叫唤”的消息时,它们根据此
消息作出了各自不同的反应。但这样的“多态性”是无法令人满意的,如果后来又增加了一只动
物,比如狗,显然狗的叫声是“汪汪汪”,此时我们必须得改动
makeSound
函数,才能让狗也发出
叫声。修改代码总是危险的,修改的地方越多,程序出错的可能性就越大,而且当动物的种类越
来越多时,
makeSound
有可能变成一个巨大的函数。
多态背后的思想是将“做什么”和“谁去做以及怎样去做”分离开来,也就是将“不变的事
物”与 “可能改变的事物”分离开来。在这个故事中,动物都会叫,这是不变的,但是不同类
型的动物具体怎么叫是可变的。把不变的部分隔离出来,把可变的部分封装起来,这给予了我们
扩展程序的能力,程序看起来是可生长的,也是符合开放—封闭原则的,相对于修改代码来说,
仅仅增加代码就能完成同样的功能,这显然优雅和安全得多
。
1.2.2 对象的多态性
首先把不变的部分隔离出来,=》所有的动物都会发出叫声
let makeSound = function(animal){
animal.sound()
}
然后把可变的部分各自封装起来,多态性实际上指对象的多态性
let Duck = function(){}
Duck.prototype.sound = function(){
console.log('嘎嘎嘎')
}
let Chicken = function(){}
Chicken.prototype.sound = function(){
console.log('咯咯咯')
}
调用
makeSound(new Duck())
makeSOund(new Chicken())
鸭和鸡都发出‘叫’的消息,接到消息后分别作了不同的反应。
增加一只狗,只要追加就行了
let Dog = function(){}
Dog.prototype.sound = function(){
console.log('汪汪汪')
}
makeSound(new Dog())
1.2.3 类型检查和多态
类型检查是在表现出对象多态性之前的一个绕不开的话题,但
JavaScript
是一门不必进行类
型检查的动态类型语言,为了真正了解多态的目的,我们需要转一个弯,从一门静态类型语言说起。
静态语言在编译时会进行类型匹配检查,例如JAVA:在代码编译时进行严格的类型检查,不能给变量赋不同类型的值
String str
str = 'abc'
str = 2//报错
一个多态思路:多个地图通过调用一个方法实现
let googleMap = {
show(){
console.log('谷歌地图')
}
}
let baiduMap = {
show(){
console.log('百度地图')
}
}
let renderMap = function(map){
if(map.show instanceof Function){
map.show()
}
}
renderMap(googleMap)
1.4原型模式
1.4.1 使用克隆的原型模式
从设计模式的角度讲,原型模式是用于创建对象的一种模式,如果我们想要创建一个对象,一种方法是先指定它的类型,然后通过类来创建这个对象。
原型模式选择了另外一种方式,我们不再关心对象的具体类型,而是找到一个对象,然后通过克隆来创建一个一模一样的对象。
既然原型模式是通过克隆来创建对象的,那么很自然想到,
如果需要一个跟某个对象一模一样的对象,就可以使用原型模式
例子:飞机大战游戏,如果某种飞机拥有分身技能,使用技能时,要在页面创建跟他一模一样的飞机,包括血量什么的。
let Plane = function(){
this.blood = 100;
this.attackLevel = 1;
this.defenseLevel = 1;
}
var plane = new Plane()
plane.blood = 500;
plane.attackLevel = 10
plane.defenseLevel = 7;
let clonePlane = Object.create(plane)
console.log(clonePlane) //输出Object{blood:500,attackLevel:10,defenseLevel:7}
在不支持Object.create方法的浏览器中,可以使用下面的代码
Object.create = Object.create || function(obj){
let F = function(){}
F.prototype = obj
reutrn new F()
}
1.4.2 克隆是创建对象的手段
Object.getPrototypeOf( a ) =》
用于读取一个对象的 prototype 对象。
1.4.6 ES6带来的Class语法
class Animal {
constructor(name) {
this.name = name;
}
getName() {
return this.name;
}
}
class Dog extends Animal {
constructor(name) {
super(name);
}
speak() {
return "woof";
}
}
let dog = new Dog('Scamp')
console.log(dog.getName()+'say'+dog.speak())//Scampsaywoof