javascript语言是面向对象还是面向过程?

今天从同事那儿听到一句话,“java不同于javascript,Java是面向对象的”。言下之意,难不成javascript是面向过程?

虽然javascript一直容易被人长期误解,但其确确实实的是面向对象的编程语言。
很多人可能觉得只有像java, c++这样的编程语言才能称之为面向对象,这个认知比较先入为主,让我们从面向对象的概念开始理解。

什么是面向对象?

有三个核心概念:

  • 一切事物皆对象,(tips: javascript 中除了两个特殊值undefined 和 null.)
  • 对象具有封装和继承特性
  • 对象与对象之间使用消息通信,各自存在信息隐藏。

基于这三点,我们再来看,
C++ 是半面向对象半面向过程语言,因为,虽然其实现了类的封装、继承和多态,但存在非对象性质的全局函数和变量。
Java、C# 倒是完全的面向对象语言,通过类的形式组织函数和变量,使之不能脱离对象存在。但这里函数本身是一个过程,只是依附在某个类上。

然而,面向对象仅仅是一个概念或者编程思想而已,它不应该依赖于某个语言存在。比如 Java 采用面向对象思想构造其语言,它实现了类、继承、派生、多态、接口等机制。但是这些机制,只是他实现面向对象编程的一种手段而已,而非必须。
换句话来说就是,一门语言是可以根据其自身特性选择合适的方式来实现面向对象,就像下雨天,选择建筑物还是打伞来避雨,方式不一样而已。

由于大多数人,像我们都是首先学习或者使用的是类似 Java、C++ 等高级编译型语言,先入为主地接受了“类”这个面向对象实现方式,从而在学习脚本语言的时候,习惯性地用类式面向对象语言中的概念来判断该语言是否是面向对象语言,或者是否具备面向对象特性。实际上,JavaScript语言是通过一种叫做原型(prototype)的方式来实现面向对象编程的。它和其他的面向对象类编程语言一样,只是它的实现方式不同而已,或者说他们采用了不同的面向对象设计哲学。

让我们从大家熟悉的类继承入手,

  • 类继承就是在函数对象内调用父类的构造函数,使得自身获得父类的属性和方法。
  • 但是原型继承呢,继承不在对象本身,而是在对象的原型上。子类的构造函数中不拥有父类对象的方法和属性。

那么让我们看一个简单的例子来和“原型继承”初次感受一下。

  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更容易被大多数人所接受,成为了现在最流行的原型继承语言也说不定。

  • 7
    点赞
  • 18
    收藏
    觉得还不错? 一键收藏
  • 10
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 10
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值