我正在努力理解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'
Object.prototype
... - Šime Vidas(Object.create(null)).toString() === TypeError
对象不需要具有原型。但是没有原型是愚蠢的。 - Raynosswiss()
方法,也没有定义。所有这些方法稍后都在“Sugar”部分中定义。 - Stas Bichenko