【问题标题】:Javascript Parasitic InheritanceJavascript 寄生继承
【发布时间】:2011-08-30 22:12:21
【问题描述】:

我正在为 Javascript 经典继承 1 苦苦挣扎。虽然最终 Douglas Crockford 拒绝了它在 Javascript 中支持经典模型的第一次尝试,但我觉得理解起来很有趣:

我写 JavaScript 已经 8 年了,我从来没有发现需要使用 uber 函数。超级想法在经典模式中相当重要,但在原型和功能模式中似乎是不必要的。我现在认为我早期在 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'

【问题讨论】:

  • 所有对象都至少继承自Object.prototype...
  • 嗯,错误说明了什么?
  • 是的。这个错误不是因为我的想法,而是一个错字。但是,我没有考虑过所有对象都继承自作为对象的 Functions 的事实。谢谢!
  • @SimeVidas (Object.create(null)).toString() === TypeError 对象不需要有原型。但是没有一个是愚蠢的。
  • 天哪,我很高兴有人也注意到了这种奇怪现象。我以为我中风了!还有一个swiss() 方法,它也没有定义。所有这些方法都在后面的“糖”部分定义。

标签: javascript inheritance


【解决方案1】:

您可以修改 Parenizor 的原型,使其具有 uber 功能,并且可以使用任何其他值。

【讨论】:

  • 你是对的。但是作者决定只给那些继承对象一个 uber 功能的事实让我思考。
  • 是的,在这种情况下,它似乎完全没用,但这仅取决于“继承”对象的用途
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2010-10-30
  • 1970-01-01
  • 2021-12-07
  • 2011-11-27
相关资源
最近更新 更多