如何判断某种语言是面向对象还是面向过程?
首先,什么是面向对象?
一切事物皆对象,(tips: javascript 中除了两个特殊值undefined 和 null.)
对象具有封装和继承特性
对象与对象之间使用消息通信,各自存在信息隐藏。
基于上面三点 我们可以说:
C++ 是半面向对象半面向过程语言,因为,虽然其实现了类的封装、继承和多态,但存在非对象性质的全局函数和变量。
Java、C# 倒是完全的面向对象语言,通过类的形式组织函数和变量,使之不能脱离对象存在。但这里函数本身是一个过程,只是依附在某个类上。
总结:面向对象仅仅是一个概念或者编程思想而已,它不应该依赖于某个语言存在。比如 Java 采用面向对象思想构造其语言,它实现了类、继承、派生、多态、接口等机制。但是这些机制,只是他实现面向对象编程的一种手段而已,而非必须。
因为我们最开始的时候 都是学习的Java C++等高级编译型语言。
而我们之后再学习脚本语言,会习惯性的用面向对象语言的概念来判断是否是面向对象。
实际上 JS语言是通过一种叫 原型 的方式来实现面向对象编程的。它和其他的面向对象类编程语言一样,只是它的实现方式不同而已,或者说他们采用了不同的面向对象设计哲学。
类继承就是在函数对象内调用父类的构造函数,使得自身获得父类的属性和方法。
但是原型继承呢,继承不在对象本身,而是在对象的原型上。子类的构造函数中不拥有父类对象的方法和属性。
var Person = function(name, city){
this.name = name;
this.city = city || "China";
}
var jean = new Person("Jean"); //new 一个新对象
console.log(jean.__proto__.constructor);//隐式链接,指向Person 原型的构造函数(函数带有constructor属性,这一属性指向函数自身)
大家是不是觉得很熟悉,因为写法跟“类继承“很相似。其实javascript还是沿袭了类继承的形式(其中在ES6添加了class 关键字,但也不过是语法糖,本质上还是原型继承),听起来有点不伦不类,但是也许就是因为这种妥协,让javascript更容易被大多数人所接受,成为了现在最流行的原型继承语言也说不定。
面向对象和面向过程:
面向过程就是分析出解决问题所需要的步骤,然后用函数把这些步骤一步一步实现,使用的时候一个一个依次调用就可以了;
面向对象是把构成问题事务分解成各个对象,建立对象的目的不是为了完成一个步骤,而是为了描叙某个事物在整个解决问题的步骤中的行为。
面向过程:
优点:性能比面向对象高,因为类调用时需要实例化,开销比较大,比较消耗资源;比如单片机、嵌入式开发、 Linux/Unix等一般采用面向过程开发,性能是最重要的因素。
缺点:没有面向对象易维护、易复用、易扩展
面向对象:
优点:易维护、易复用、易扩展,由于面向对象有封装、继承、多态性的特性,可以设计出低耦合的系统,使系统 更加灵活、更加易于维护
缺点:性能比面向过程低

浙公网安备 33010602011771号