JavaScript的多态和封装

2019-12-18  本文已影响0人  龚达耶

在之前的文章中我们已经介绍了JavaScript的继承包含了ES5和ES6的版本。

ES5继承 传送门

ES6继承 传送门

今天我们介绍面向对象剩下的多态和封装

多态

在《JavaScript设计模式与开发实践》中介绍到多态就是同一操作在不同对象上产生不同的解释和执行结果。

const Daye = function() {}
const Erye = function(){}
const daye = new Daye();
const erye = new Erye();


const getPeople = people => {
  if(people instanceof Daye){
    console.log('你是大爷')
  } else if (people instanceof Erye){
    console.log('你是二爷')
  }
}


getPeople(daye) // 你是大爷
getPeople(erye) // 你是二爷

这时候三爷来了我们就需要改getPeople代码, 如果说今后代码多了我们可能会出错。
所以我们来改进这个代码,先把要变的抽象出来,因为多态就是对象的多态。

这里我们使用原型链

const Daye = function() {}
Daye.prototype.name = function(){
  console.log('你是大爷')
}

const Erye = function() {}
Erye.prototype.name = function(){
  console.log('你是二爷')
}

const daye = new Daye();
const erye = new Erye();


const getPeople = people => {
  people.name()
}


getPeople(daye)
getPeople(erye)

这样我们随便加好几个都ok

当然如果是对象的话我们也可以修改我们之前的代码

<script type="text/javascript">
const daye = {
  name: ()=>{
    console.log('你是大爷')
  }
}
const erye = {
  name: ()=>{
    console.log('你是二爷')
  }
}


const getPeople = people => {
  if (people.name instanceof Function) {
    people.name()
  }
}


getPeople(daye)
getPeople(erye)

封装

封装就是将信息隐藏 在JS中我们可以用let或const定义作用域 或者用Symbol创建私有属性

关于Symbol可以看我之前的文章

Symbol 传送门

let声明的变量只在其所在的代码块内有效

for循环计数器是最适合let

如果在函数外就会报错

let things = ['apple', 'pear', 'mongo']
for (let i = things.length - 1; i >= 0; i--) {
  console.log(i)
  console.log(things[i])
}
console.log(i) //  i is not defined
上一篇 下一篇

猜你喜欢

热点阅读