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是一个使用原型链的方式实现面向对象编程范式的面向对象语言。