关于 JavaScript 是否是面向对象的语言一直存在一些问题。甚至声明,“仅仅因为一种语言有对象并不能使它成为面向对象。”
JavaScript 是面向对象的语言吗?
关于 JavaScript 是否是面向对象的语言一直存在一些问题。甚至声明,“仅仅因为一种语言有对象并不能使它成为面向对象。”
JavaScript 是面向对象的语言吗?
IMO(这只是一种意见)面向对象语言的关键特征是它将支持polymorphism。几乎所有动态语言都这样做。
下一个特性是封装,这在 Javascript 中也很容易做到。
然而,在许多人的脑海中,继承(特别是实现继承)会在语言是否有资格被称为面向对象方面取得平衡。
Javascript 确实提供了一种相当简单的方法来通过原型设计继承实现,但这是以封装为代价的。
因此,如果您的面向对象标准是多态性、封装性和继承性的经典三人组,那么 Javascript 就不会通过。
编辑:提出补充问题“原型继承如何牺牲封装?” 考虑这个非原型方法的例子:-
function MyClass() {
var _value = 1;
this.getValue = function() { return _value; }
}
_value 属性是封装的,不能被外部代码直接修改。我们可能会向类添加一个 mutator,以完全由属于类的代码控制的方式对其进行修改。现在考虑对同一类的原型方法:-
function MyClass() {
var _value = 1;
}
MyClass.prototype.getValue = function() { return _value; }
嗯,这是坏了。由于分配给 getValue 的函数不再在 _value 的范围内,因此无法访问它。我们需要将 _value 提升为 of 的属性,this
但这将使其在为类编写的代码控制之外可访问,因此封装被破坏。
尽管如此,我仍然认为 Javascript 是面向对象的。为什么?因为给定一个OOD,我可以在 Javascript 中实现它。
语言不需要完全像 Java 那样面向对象。Javascript 中的一切都是对象;与 C++ 或更早的 Java 相比,后者在某种程度上被广泛认为是面向对象的,但仍然基于原语。多态性在 Javascript 中不是问题,因为它根本不关心类型。语法不直接支持的唯一核心 OO 特性是继承,但可以很容易地实现,无论程序员想要使用原型:这是一个这样的例子。
是和否。
正如 Douglas Crockford 所说,JavaScript 是“世界上最容易被误解的编程语言”。他有一些关于 JavaScript 的很棒的文章,我强烈建议您阅读有关 JavaScript 到底是什么的文章。它与 LISP 的共同点比 C++ 多。