基于类的语言(如Java或Python)与基于原型的语言(如Javascript)之间的区别?

时间:2012-07-23 21:11:54

标签: javascript python class prototype

  

可能重复:
  prototype based vs. class based inheritance

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

任何人都可以详细说明或详细介绍它们之间的差异吗?

我没有在网上找到很多差异,只是网站向您展示如何与另一个完成一个(例如:Simulating classes with prototypes in JavaScript

任何启示都赞赏!

4 个答案:

答案 0 :(得分:6)

结帐this article。这是一篇详细的文章,讨论了基于类和基于原型的语言之间的差异。

总结差异的表格副本:

基于类(Java)

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

基于原型(JavaScript)

  • 所有对象都是实例。
  • 使用构造函数定义和创建一组对象。
  • 相同。
  • 通过将对象指定为与构造函数关联的原型来构造对象层次结构。
  • 按照原型链继承属性。
  • 构造函数或原型指定一组初始属性。可以动态地向单个对象或整个对象集添加或删除属性。

答案 1 :(得分:3)

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

基于类的语言往往从上到下,从一般到特定。经典的例子是你定义一个'Vehicle'类,然后是'Car','Train'这样的子类。

基于原型的语言倾向于从特定的语言开始,实际上从特定的实例开始并修改它。

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

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

答案 2 :(得分:1)

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

答案 3 :(得分:0)

嗯,他们(通常)都是完整的。 :)

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

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

这里实际上有一个非常好的讨论:http://yehudakatz.com/2011/08/12/understanding-prototypes-in-javascript/虽然还有其他一些同样好的我喜欢那个。