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



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

这个问题在前几天的工作中出现了——像Python这样的基于类的语言和像Javascript这样的基于原型的语言有什么区别?除了不同的方法外,这两种方法似乎非常相似,我们很难找到基于类的语言可以做的事情,而基于原型的语言不能做的事情。

有人能详细说明它们之间的根本区别吗?

我在网上没有发现太多关于差异的信息,只是一些网站向你展示了如何实现一个与另一个的差异(比如:用JavaScript中的原型模拟类)

感谢任何启蒙!

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

总结差异的表格副本:

基于类(Java)

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

基于原型(JavaScript)

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

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

基于类的语言往往从上到下工作,从一般到特殊。典型的例子是定义一个"Vehicle"类,然后定义子类,如"Car"、"Train"。

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

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

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

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

嗯,它们都(通常)正在完成。:)

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

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

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

最新更新