面向对象学习总结

465 阅读6分钟

面向对象(OOP)的简单介绍

面向对象是一种范例式编程,包含了数据(属性)和代码(方法)。对象的一个功能是程序可以通过它们自身建立的方法(this或self)获取或修改数据。面向对象是通过区分相互作用的对象设计的。面向对象语言有很多种类型,其中最常见的是基于类设计的,也就是说对象是决定了它们的类型的类的实例。 很多被广泛使用的代码是多范式的(C++、Java、Python),它们让面向对象编程的影响力越来越大,变成了一种典型的编程方式。

面向对象编程是一种依据数据或事物而不是函数和逻辑所设计组织的编程语言。面向对象语言包含了类和对象,可以继承类或原型,使得代码可以重用和扩展。类包含数据和方法,而对象是它们的实例,一个对象可以被定义为有独立的属性和行为的一组数据。

举例:超市是一个类,那么购物车、售货员、商品是它的对象。

对象被访问内部的变量结构,外部对象可以调用该对象的方法去获取、修改该对象的变量。对象可以通过构造函数中的constructor来获取。一段程序可以获取很多类的实例,并且独立运行。 基于类编程的面向对象使用类,而基于原型编程的不使用类。

基于类和基于原型的面向对象

基于类编程,首先定义了类,再实例化对象,这些对象都继承了类的一些方法,所以可以用相同的方法去处理这些对象。

基于原型编程,对象是主要实体,没有类。新的对象可以选择已经存在的对象作为它们的基础。原型的方法和属性可以委托给所有依据原型创建出的对象。而原型独立拥有的方法和属性不能共享给其他创建的对象。通过原型只能实现单一继承。

面向对象的特性

封装性

每一个对象的实施和状态是私有地存储在它所定义的类里面。其他的对象没有方法去获取这个类或者修改类,除非它获取一些公共的函数和方法。这种将数据隐藏的属性给程序提供了更好的安全性和避免了数据毁坏。

抽象性

对象仅仅提供了与其他的对象相关的内部机制,而隐藏了不必要的运行代码。这个属性帮助开发者日后更简单地做出修改和添加。

可继承性

对象的关系和子类可以被分配,使得开发者重复使用有唯一层次的通用逻辑。这个属性会有更彻底的数据分析,减少了开发者的时间和确保了更高层级的准确性。

多态性

对象可根据上下文采用多种形式。这个程序会确定对象每次执行的含义和方法,从而减少重复的代码。

面向对象的原则

开闭原则、里氏代换原则、迪米特原则、单一职责原则、接口分隔原则、依赖倒置原则、组合/聚合复用原则

面向对象语言与其他语言的共同点

  1. 变量可以存储数据类型(整数、浮点数等),也可以存储数据结构(string、list、hash表等)
  2. 程序(函数、方法、例程、子例程)可以输入、生成、输出数据。结构化编程包括循环和条件。
  3. 模块化编程提供了将程序组进文件和模块的功能。所有模块被命名,这样各个模块的程序不会冲突,各个模块的变量也可以使用同一个变量名。

面向对象的缺点

过分强调了软件开发的数据组成部分,没有将重点放在算法上。面向对象程序代码的编写可能更加复杂,编译时间也可能更长。面向对象编程的代替方法是功能编程、结构化编程和命令式编程,也可将以上几种方法组合使用。

面向对象和面向过程(POP)

面向对象和面向过程都是具有多种范式元素的语言,这两种语言根据设计方法时的抽象性来区分的。面向过程是过程抽象而面向对象是数据抽象。

面向对象与面向过程的区别:

定义:

面向对象编程是一种编程范例,专注于数据抽象;面向过程的编程是一种编程范例,专注于过程抽象。

功能:

面向对象中,程序分为称为对象的部分。面向过程方法中,程序分为功能。

重点:

面向对象主要重点是与程序关联的数据。面向过程的主要重点在于处理数据的过程和算法。

设计方法:

面向对象遵循自下而上的方法。面向过程采用自上而下的方法。

数据使用:

在面向对象中,每个对象控制其中的数据。在面向过程中,大多数功能使用全局数据。

数据存取

在面向对象中,对象的数据只能由该特定对象的功能访问。面向过程中,数据可以在功能之间自由移动。

访问说明符 面向对象具有访问说明符,例如Public,Private等。面向过程没有任何访问说明符。

资料安全 面向对象提供数据隐藏,因此与程序关联的数据是安全的。面向过程不提供任何数据隐藏方法。因此,数据不太安全。

有效性

面向对象提供了简单有效的方法来添加新数据和功能,而无需修改现有程序。面向过程中,如果需要添加新数据或功能,则必须修改现有程序。

另外,它们使用的语言也是不同的

javascript与面向对象编程

javascript是基于原型编程的

// 原型
var Person = function(name) {
    this.name = name
}
//实例
var person1 = new Person('aa')
var person2 = new Person('bb')

console.log(person1.name) // 'aa'
console.log(person2.name) // 'bb'

console.log(person1 instanceof Object) // true
console.log(person1 instanceof Person) // true
// 原型模式
var Person = function() {}
Person.prototype.name = "prototype"
Person.prototype.sayName = function() {
    console.log(this.name)
}

var person1 = new Person()
person1.sayName() // 'prototype'
// 原型继承
function SuperType() {
    this.property = true
}
SuperType.prototype.getSuperValue = function() {
    return this.property
}
function SubType() {
    this.subproperty = false
}
SubType.prototype = new SuperType()
SubType.prototype.getSubValue = function() {
    return this.subproperty
}
SubType.prototype.getSuperValue = function() {
    return false
}

参考资料

searchapparchitecture.techtarget.com/definition/…

www.differencebetween.com/difference-…

en.wikipedia.org/wiki/Object…

《javascript高级程序设计(第3版)》