JavaScript 寄生式继承

7
我正在努力理解Javascript的经典继承1。最终,Douglas Crockford拒绝了在Javascript中支持经典模式的第一次尝试,但我发现理解它很有趣:

我已经写了8年JavaScript了,从来没有找到过使用超级函数的必要性。在经典模式中,super的概念相当重要,但在原型和函数模式中似乎并不需要。我现在认为,我早期在JavaScript中支持经典模式的尝试是一个错误。

然而,对于寄生继承,还有一些不太清楚的地方:
function ZParenizor2(value) {
   var that = new Parenizor(value);
   that.toString = function () {
      if (this.getValue()) {
         return this.uber('toString');
      }
      return "-0-"
   };
   return that;
 }

ZParenizor据我所了解是以Parenizor为基类定义的。但是Parenizor是基类,并没有继承任何东西。因此,this.uber函数将不会被定义,实际上当我调用一个新的ZParenizor2对象的toString方法时,会出现错误。

我是正确的,还是忽略了什么?

更新 我是正确的。只有在使用0作为参数创建ZParenizor时,该方法才有效,因为它不需要调用uber方法(正如您可以从方法实现中看到的那样)。

当您尝试使用不同的参数时,我会收到此错误:

Uncaught TypeError: Object #<error> has no method 'uber'

1
所有对象至少继承自Object.prototype... - Šime Vidas
1
那么,错误信息是什么? - Šime Vidas
所以,有一件事我想知道。Parenizor是一个函数对象吗?我会回答是的,因为它的构造函数是一个函数,原型也是...对吧? - user278064
2
@SimeVidas (Object.create(null)).toString() === TypeError 对象不需要具有原型。但是没有原型是愚蠢的。 - Raynos
1
哦天啊,我太高兴了,有人也注意到这个奇怪的问题。我还以为我中风了!还有一个swiss()方法,也没有定义。所有这些方法稍后都在“Sugar”部分中定义。 - Stas Bichenko
显示剩余4条评论
1个回答

2

您可以修改Parenizor的原型,使其具有超级函数,并且它将适用于任何其他值。


你说得对。但是作者决定只给那些继承对象的人提供一个超级函数,这让我想了一下。 - user278064
是的,在那种情况下它似乎完全没有用,但这只取决于“继承”对象所给予的用途。 - Chiguireitor

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接