javascript语⾔是⾯向对象还是⾯向过程?
今天从同事那⼉听到⼀句话,“java不同于javascript,Java是⾯向对象的”。⾔下之意,难不成javascript是⾯向过程?
虽然javascript⼀直容易被⼈长期误解,但其确确实实的是⾯向对象的编程语⾔。
很多⼈可能觉得只有像java, c++这样的编程语⾔才能称之为⾯向对象,这个认知⽐较先⼊为主,让我们从⾯向对象的概念开始理解。
什么是⾯向对象?
有三个核⼼概念:
⼀切事物皆对象,(tips: javascript 中除了两个特殊值undefined 和 null.)
对象具有封装和继承特性
对象与对象之间使⽤消息通信,各⾃存在信息隐藏。
基于这三点,我们再来看,
C++ 是半⾯向对象半⾯向过程语⾔,因为,虽然其实现了类的封装、继承和多态,但存在⾮对象性质的全局函数和变量。
Java、C# 倒是完全的⾯向对象语⾔,通过类的形式组织函数和变量,使之不能脱离对象存在。但这⾥函数本⾝是⼀个过程,只是依附在某个类上。
然⽽,⾯向对象仅仅是⼀个概念或者编程思想⽽已,它不应该依赖于某个语⾔存在。⽐如 Java 采⽤⾯向对象思想构造其语⾔,它实现了类、继承、派⽣、多态、接⼝等机制。但是这些机制,只是他实现⾯向对象编程的⼀种⼿段⽽已,⽽⾮必须。
换句话来说就是,⼀门语⾔是可以根据其⾃⾝特性选择合适的⽅式来实现⾯向对象,就像下⾬天,选择建筑物还是打伞来避⾬,⽅式不⼀样⽽已。
由于⼤多数⼈,像我们都是⾸先学习或者使⽤的是类似 Java、C++ 等⾼级编译型语⾔,先⼊为主地接受了“类”这个⾯向对象实现⽅式,从⽽在学习脚本语⾔的时候,习惯性地⽤类式⾯向对象语⾔中的概念来判断该语⾔是否是⾯向对象语⾔,或者是否具备⾯向对象特性。实际上,JavaScript语⾔是通过⼀种叫做原型(prototype)的⽅式来实现⾯向对象编程的。它和其他的⾯向对象类编程语⾔⼀样,只是它的实现⽅式不同⽽已,或者说他们采⽤了不同的⾯向对象设计哲学。
让我们从⼤家熟悉的类继承⼊⼿,
类继承就是在函数对象内调⽤⽗类的构造函数,使得⾃⾝获得⽗类的属性和⽅法。
但是原型继承呢,继承不在对象本⾝,⽽是在对象的原型上。⼦类的构造函数中不拥有⽗类对象的⽅法和属性。
javascript的特性那么让我们看⼀个简单的例⼦来和“原型继承”初次感受⼀下。
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更容易被⼤多数⼈所接受,成为了现在最流⾏的原型继承语⾔也说不定。

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。