3 回答
TA贡献1936条经验 获得超6个赞
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实现它。
TA贡献1802条经验 获得超5个赞
语言不需要像Java那样完全面向对象。Javascript中的所有内容都是对象。与C ++或更早的Java相比,后者在某种程度上被广泛认为是面向对象的,但仍基于原语。多态性在Javascript中不是问题,因为它根本不关心类型。语法不直接支持的唯一核心OO功能是继承,但是可以轻松实现,但是程序员希望使用原型:这是一个这样的示例。
添加回答
举报