三特点
我们都知道面向对象有三个基本特点:封装、继承、多态。有多少开发终日埋头苦干,把这三个基本特点都忘记了哈哈。没关系,今天咱们稍微捡起来,说不定让你回看以前的代码时,有新的体会。
封装
说到封装,其实做平时做业务开发的时候就能体会到了,当引入一个第三方库的时候,我们根本不用去了解其源码,直接把库中导出的默认对象引入到组件里,就可以使用它带来的功能了。
再举个例子,咱们有时候会new一个实例,这个被new的东西也是一个封装的体现。例如new Promise
,我们无需关系Promise内部具体是怎么实现的,用就完事。
一般封装的东西会有什么特点呢?大白话来说就是,你就用我给你的东西就行了,内部的其他东西你别动!
哈哈,举个例子,咱们用class写个类:
class Man {
constructor(name,age){
this.name = name;
this.age = age;
}
getName(){
let { name } = this;
return name
}
static seyHi(){
console.log("Hi");
}
}
let m = new Man("小马",18);
m.seyHi(); // m.seyHi is not a function 实例无法使用这个方法
m.getName(); // 小马
Man.seyHi(); // Hi 类直接使用这个方法
Man.getName(); // not a function 类无法使用普通的方法
类中用 static
修饰符,对seyHi
方法做了访问权限的封装,也就是改变其为静态方法,seyHi
只属于Man
这个类。只有类能直接调用,实例访问不了静态方法。
而getName
方法是属于实例的,类也无法使用普通的内置方法。
这也就解释了为啥有些内置对象无法直接使用一些方法。例如Promse。
Promise.then() // is not a function 说明then是个普通的内置方法,需要实例化后才能使用
let p1 = new Promise(() => {})
p1.then(); // 像这样
// .all的方法就是静态方法,所以可直接使用
Promise.all([fn])
继承
继承就是子类可继承父类的属性和方法,并且也能有自己独有的属性和方法。可以说是一浪更比一浪强哈哈。
可以直接看:【es6入门】类的声明与继承,class与extends语法糖,如何用原型模拟继承
多态
简单理解就是类的状态可以不是写死的,可以是灵活多变的。
多态的表现形式有重写和重载。
重写
就是子类继承的时候可以直接把自己写个和父类一样的东西,这样子类实例化变量在调用这个方法时,直接从子类原型上调用,而补充父类原型上调用了。
还是拿博客中的例子:
class Man {
constructor(name){
this.name = name;
}
seyHello(){
console.log("Hello")
}
}
class Son extends Man{
constructor(name){
super(name);
}
seyHello(){
console.log(`Hello World`)
}
}
const m = new Man("小马");
m.seyHello(); // Hello World
能看到子类把seyHello方法进行了重写。
重载
可以理解为一个大类中包含几个小类,根据需求实例化出不同的类。
这里拿别人的例子(忘记从哪里看来的了,当时顺带修改了错误):
class Employees {
constructor(arg){
let obj = null;
switch(typeof arg)
{
case "string":
obj = new StringEmployees(arg);
break;
case "object":
obj = new ObjEmployees(arg);
break;
case "number":
obj = new NumberEmployees(arg);
break;
}
return obj;
}
}
class ObjEmployees {
constructor(arg){
console.log("ObjEmployees")
}
}
class StringEmployees {
constructor(arg){
console.log("StringEmployees")
}
}
class NumberEmployees {
constructor(arg){
console.log("NumberEmployees")
}
}
new Employees({}) // ObjEmployees
new Employees("123456") // StringEmployees
new Employees(987654) // NumberEmployees
这就是一个简单的重载。
我的理解
JS面向对象个人还是有些自己的理解心得,若有错误欢迎指出学习。
面向对象的开发优点:
从小的角度来说:
- 减少代码量;
- 减少开发理解精力;
- 降低编写程序的难度;
- 提升开发效率;
- 加强维护性;
从大的角度来说:
- 让项目代码能够更好的复用,扩展和工程化;
- 后续语言原生支持面向对象会是语言发展必然基础;
抛开高级开发,其实,在写业务的时候,无时无刻都在践行着面向对象的开发思想,如果解到JS和Pythone一样,有着万物皆为对象的特性后,再去看看自己的日常开发,哪个东西不是对象,我们的第三方库、自己写的组件,对接的接口,一个个函数…这些都给开发人员带来了无数的便利。
当然,面向过程开发我认为是不会有过时这种说法的,因为我觉得面向对象和面向过程这两者是相辅相成的,我相信未来的高级语言开发会是面向过程,面向对象,面向API的完美融合方式。