面向对象语言--JavaScript

119 阅读1分钟

js是面向对象语言吗?

这个问题从我开始学JS就一直伴随着我。

“不是”,“是非典型的面向对象”,“不能多态的面向对象”。。。

当然我目前的理解也是基于他人的说辞,但至少说服了现在的我。

要想判断JS是否是面向对象语言的前提是什么是面向对象语言?什么是对象?

对象是对实体的抽象。在这个的基础上,不同语言使用了不同的实现方式,java中使用类去实现,而javascript使用原型的方法去实现。

而问题中 面向对象(Object-oriented programming oop)是一种编程范式。js是面向对象语言吗就是再问,js符合面向对象编程范式吗?

在mdn中有讲到面向对象编程的三个基本概念:类与实例继承封装。虽然在mdn中寻找面向对象编程的范式有些本末倒置,但毫无疑问,js是完全符合面向对象的。

但js是通过原型的方式实现继承的。

在ES6之前继承是通过寄生组合继承的方式实现的,ES6之后可以使用Class关键字实现继承,但原理都是一样。

使用寄生组合的方式:

function inheritPrototype(subType, superType){
    let prototype = Object(superType.prototype)
    prototype.contructor = subType
    subType.prototype = prototype
}

function SuperType(name){
    this.name = name
    this.colors = ['red', 'blue', 'green']
}

function SubType(name, age){
    SuperTime.call(this, name)
    this.age = age
}

inheritPrtotype(SubType, SuperType)

SubType.prototype.sayAge = function() { console.log(this.age)}

使用类的方式:

class SuperType {
    contructor(name){
        this.name = name
    }
}

class SubType extends SuperType {
    contructor(name, age){
        this.age = age
    },
    sayName() { console,log(this.age)}
}

类关键字本质上也是一个函数 console.log(instanceof SubType) //function

因此JS是一个使用原型链的方式实现面向对象编程范式的面向对象语言。