一尘不染

JavaScript是面向对象的吗?

javascript

关于JavaScript是否是面向对象的语言存在一些问题。甚至有这样的说法:“仅仅因为一种语言包含对象,并不能使它成为OO。”

JavaScript是一种面向对象的语言吗?


阅读 356

收藏
2020-05-01

共1个答案

一尘不染

IMO(并且仅是一种意见) 面向 对象语言 主要特征是它将支持多态。几乎所有动态语言都可以做到这一点。

下一个特征是封装 ,这在Javascript中也很容易做到。

但是,在许多人的心中,继承 (特别是实现继承)将在某种语言是否符合被称为面向对象的语言方面取得平衡。

Javascript确实提供了一种相当容易的方法来通过原型继承实现,但这是以封装为代价的。

因此,如果您面向对象的标准是多态性,封装和继承的经典三人组合,那么Javascript不会通过。

编辑 :提出了一个补充问题“原型继承如何牺牲封装?” 考虑以下非原型方法的示例:

function MyClass() {
    var _value = 1;
    this.getValue = function() { return _value; }
}

_value属性是封装的,不能由外部代码直接修改。我们可能会在类中添加一个更改器,以完全由属于该类的代码控制的方式对其进行修改。现在考虑对同一个类的原型方法:

function MyClass() {
  var _value = 1;
}
MyClass.prototype.getValue = function() { return _value; }

好吧,这坏了。由于分配给getValue的函数不再在_value范围内,因此无法访问它。我们将需要将_value提升为的属性,this但这将使其在为该类编写的代码的控制范围之外可访问,因此封装被破坏了。

尽管如此,我仍然投票赞成Javascript是面向对象的。为什么?因为给定了OOD,所以我可以用Javascript实现它。

2020-05-01