理解经典和原型继承之间的区别

时间:2016-04-09 14:48:27

标签: javascript prototype

在过去的一周里,我一直试图理解基于类和原型继承之间的区别。在使用PHP和JavaScript之后,我希望能够很快掌握这一点,但我无法解决这个问题 - 我总是觉得我错过了一些东西。

我已经知道课程就像定义对象特征的蓝图。实例化类时,根据蓝图构造对象。当继承发挥作用时,蓝图只能被完全采用,但方法可以被覆盖。

那么什么是原型呢?它还喜欢蓝图,但已经实现了(因此名称"原型")?那么继承,你只能指向现有的函数吗?

以下看似愚蠢,但这就是我尝试理解事物的方式。

从更人性的角度来说:一个类可以被视为架构计划,一旦它被实例化,小工人就会根据该计划开始构建一个对象。要继承某些内容,除了新的详细信息(可能会替换现有详细信息)之外,还会再次构建完整的计划。

使用原型,工作人员开始复制已经存在的对象并开始查看它的主要特征(存储在称为原型的东西上)。为了从另一个对象继承,他们只是在某处写了一个标语"你正在寻找功能X?请这样 - 注意对象之间的差距"。

这种区别是否正确?

1 个答案:

答案 0 :(得分:7)

在我看来,你实际上已经明白了这一点。

基于类的OO

正如您已经提到的,在基于类的面向对象语言(如Java)中,类是每个未来对象的蓝图。对于对象的实例化,将为此对象复制蓝图(您创建的类)。这意味着如果在实例化对象后更改类,则先前创建的对象不会进行更改。

谈到继承:让我们说你有一个人类。您想要创建另一个继承自Person的类Student。学生基本上是蓝图Person的副本,可以扩展蓝图的功能。所以你的例子非常准确! 这在复杂但非常静态的OO结构中非常有用!

基于原型

像JavaScript这样的基于原型的语言并不遵循这种模板化的方法。你的例子再次打得很好。您基本上只是创建一个对象并引用另一个对象(您的原型)。您放入原型的所有功能都将由引用该原型对象的所有对象共享。但是,重要的是要了解您不要制作蓝图或模板的副本。你总是在使用对象。

所以你可以创建一个Person对象。这样的方法就像" sayHello"。如果你创造具体的人,例如Joe你只需创建另一个对象并将其链接到Person对象。因此,如果您尝试使用Joe.sayHello(),它将查看Joe对象属性,并且无法找到sayHello方法,因此它将跳转到具体的Person对象。就像你用你的例子说的那样。

我不喜欢基于原型的语言中的表达式继承,因为它实际上并不存在。您不需要复制蓝图并扩展其功能。继承基本上通过将对象链接在一起来工作。例如上面的例子。你可以拥有一个Person对象。每个常规人物对象(例如Joe)都将Person对象作为原型。现在,您创建一个将Person作为原型的Student对象。另一个对象(例如StudentJoe)可以将Student作为原型。所以它可以通过链一直到人来访问它的方法。 保持简短;):基于原型的语言只能使用链接在一起的具体对象(原型),而不是蓝色打印和模板。 这种方法的优点是动态的(这就是为什么这种方法在网络中常用的原因)。由于您从不使用模板但使用具体对象,原型链中的每个更改都将始终对每个对象(就可访问功能而言)产生影响 - 无论何时创建它。

我希望这有帮助。有一本很好的书名叫你不懂JavaScript - 这个& amp;对象原型很好地解释了基于JavaScript的这个主题。