11

可能重复:
基于原型与基于类的继承

前几天在工作中出现了这个问题——像 Python 这样的基于类的语言和像 Javascript 这样的基于原型的语言有什么区别?除了不同的方法之外,这两种方式看起来都非常相似,我们努力寻找基于类的语言可以做而基于原型的语言不能做的事情,反之亦然。

任何人都可以详细说明或详细说明它们的根本区别吗?

我在网上没有找到太多关于这些差异的信息,只是向您展示了如何完成一个与另一个的网站(例如:Simulating classes with prototypes in JavaScript

任何启蒙表示赞赏!

4

4 回答 4

6

看看这篇文章。这是一篇详细的文章,讨论了基于类和基于原型的语言之间的区别。

总结差异的表格副本:

基于类 (Java)

  • 类和实例是不同的实体。
  • 用类定义定义一个类;用构造方法实例化一个类。
  • 使用 new 运算符创建单个对象。
  • 通过使用类定义来定义现有类的子类来构造对象层次结构。
  • 按照类链继承属性。
  • 类定义指定类的所有实例的所有属性。无法在运行时动态添加属性。

基于原型 (JavaScript)

  • 所有对象都是实例。
  • 使用构造函数定义和创建一组对象。
  • 相同的。
  • 通过将对象分配为与构造函数关联的原型来构造对象层次结构。
  • 按照原型链继承属性。
  • 构造函数或原型指定一组初始属性。可以为单个对象或整个对象集动态添加或删除属性。
于 2012-07-23T21:20:27.550 回答
5

看起来你对实际的语言很熟悉,所以你知道有什么区别,对吧?我猜您是在更深层次,也许是更“哲学”的层面上询问差异。

基于类的语言倾向于从上到下,从一般到特殊。经典示例是定义“车辆”类,然后定义“汽车”、“火车”等子类。

相反,基于原型的语言倾向于从特定开始,实际上是从特定的实例开始并对其进行修改。

我喜欢这个:http ://steve-yegge.blogspot.ie/2008/10/universal-design-pattern.html

最后,这不是您是否可以在 JS 中进行继承的问题,或者您是否可以使用一种语言而不是另一种语言来做某事。他们解决问题的方式有很大的不同。对于一个特定的问题,一个能充分利用语言特性的好的惯用解决方案在基于原型的语言中可能与基于类的语言中的解决方案完全不同。

于 2012-07-23T21:22:25.783 回答
1

MDN 的 JavaScript 指南有一些好处,看看:https ://developer.mozilla.org/en/JavaScript/Guide/Details_of_the_Object_Model

于 2012-07-23T21:16:44.680 回答
0

好吧,它们(通常)都已完成。:)

类是关于强制封装,以牺牲一些(或很多)运行时可扩展性为代价。原型鼓励封装并允许几乎无限的运行时扩展。

严肃地说,基于原型的 OO 使得从对象动态扩展/派生变得非常容易——有些人会说非常容易。因此,原型语言不容易与静态类型共存。因此,如果您喜欢编译器捕获类型错误的方式,那么您几乎肯定会排除基于原型的语言。

这里实际上有一个很好的讨论:http: //yehudakatz.com/2011/08/12/understanding-prototypes-in-javascript/尽管还有其他的也一样好我喜欢那个。

于 2012-07-23T21:22:43.977 回答