没有JS面向对象编程以前,我们都用的函数式编程,可是学习曲线陡峭、存在性能问题、不适用于所有问题、调试困难以及复用性低,那么如何解决这些问题呢?面向对象编程
一、什么叫Js面向对象编程?
是一种编程范式,它使用“对象”来模拟现实世界中的事物。现实事物都看成一个包罗万象的对象,具有各种属性、功能、方法的对象。
二、面向对象编程的优点有哪些?
它最大的特点是封装、继承、多态
(1)封装:把事物看成一个对象,然后通过属性、方法等抽象封装,通过封装,可以保护对象的状态不被外部直接访问和修改,确保对象的安全性和稳定性,灵活性强,在保护内部不被修改的同时,方便使用。
比如:vue2的组件把属性(name...)、方法(data())等封装为一个对象导出供外部使用,外部可根据自己需要灵活在其中定义自己需要的方法(比如可在mathods中定义handleClick)等
export default{
name:"test",
data():return{ name:""},
methods:{
handleClick(){}
}
}
(2)继承:可以把子类共有的属性和方法抽取为一个父类,如果新的对象具有父类对同样的属性方法,可通过extends关键字去继承父类的所有属性和方法,而不需要再重复定义。这样代码重用变得简单,子类可以继承父类的属性和方法,避免了重复编写相同的代码。当然也可以prototype去继承。
继承方法一:extends
例如:编写一个Animal类,它有name属性,同时有speak功能,但是同时Dog类也有以上的属性和功能,所有用extends继承,但是它的speak,它还可以根据需要重写自己的属性方法speak,还可以拓展自己的属性
a)用extends继承
b)需要重写自己的属性方法speak
c)拓展自己的方法 jump
继承方法二:prototype
(3)多态:通过多态,允许一个类或者方法被多种类型的对象使用,增加了代码的灵活性和可扩展性。
这里Dog、Cat都同时继承了Animal,但是调用jump传入不同类型,会展现不同的效果,这就是多态,代码灵活,可拓展性强,相互之间不会影响,如果还有不同的类型jump的效果不同,可在jump里面的case里面配置即可,相互不影响,也就是既独立又统一(独立:每个new的都是独立的对象,每个类又都是独立的;统一:都统一拥有父类的属性、方法,但是不同的类都通过同一个type参数去兼容)
三、面向对象编程的缺点及解决方案
1、js面向对象编程常见的缺点
(1)复杂的继承链可能导致难以理解的代码和性能问题。
(2)没有正式的接口约束,难以保证代码的正确性。
(3)修改一个类可能会影响到继承该类的所有子类,造成破坏。
(4)缺乏专门的打包工具或者标准库来帮助管理大型的面向对象项目。
(5)对于简单的问题,使用面向对象编程可能会导致代码冗余和复杂度的增加。
2、解决方案
(1)尽量保持继承层次浅,并使用mixin或组合来构建复杂的行为。
(2)充分利用设计模式和原则,如单一职责原则、开放-封闭原则等,来保持类的职责单一,并减少修改类引起的问题。
(3)对于大型项目,可以考虑使用依赖注入等技术来管理类之间的依赖关系。
(4)简单问题,考虑使用函数式编程的方式,利用高阶函数、闭包等特性来简化代码。
总结:不管是函数式编程还是面向对象编程,都有其优缺点,简单问题建议可以使用函数式编程,复杂问题则要注意面向对象的抽象的使用。大家具体的要根据自己的业务场景选择。