Javascript原型继承问题

Javascript prototype inheritance issue

本文关键字:问题 继承 原型 Javascript      更新时间:2023-09-26

我在原型继承方面遇到了问题,我找不到为什么它无法正常工作。

片段是这样的:

function Field(newKey, val) {
    this.key = newKey || "";
    this.value = val || "";
}
Field.prototype.isEmpty = function() {
    return this.value === undefined || this.value === null || this.value === "";
};
function DoubleField(newKey, val) {
    this.base = Field;
    this.base(newKey, val);
}
DoubleField.prototype = new Field();
DoubleField.prototype.constructor = DoubleField;
function IntegerField(newKey, val) {
    this.base = DoubleField;
    this.base(newKey, val);
}
IntegerField.prototype = new DoubleField();
IntegerField.prototype.constructor = IntegerField;
var f = new Field('keyfield', 'valField');
var d = new DoubleField('keydouble', 'valDouble');
var i = new IntegerField('keyinteger');
var res = f.isEmtpy();

对 f.isEmpty 的调用失败?为什么?对 d.isEmpty 或 i.isEmpty 的调用按预期工作得很好。

无法意识到我做错了什么。任何帮助将不胜感激!

错误在代码的最后一行:

var res = f.isEmtpy();//That's what you wrote

正确的是:

var res = f.isEmpty();

你还没有说它是如何失败的。正如我在评论中指出的那样,至少有一个错字:var res = f.isEmtpy();应该var res = f.isEmpty();

但除此之外(我认为这只是问题中的错字,而不是代码(,请注意派生构造函数中的这一行:

this.base = DoubleField;

。不会按您的预期工作。考虑一下IntegerField的情况。您调用new IntegerField,它会this.base设置为DoubleField并调用它。但是DoubleField构造函数然后将this.base设置为 Field 。因此,您有一个IntegerField实例,其base属性指向Field,而不是DoubleField

不能使用实例属性来跟踪世系。它适用于父母/孩子的情况,但您遇到了上述"孙子"问题。

我建议使用那里的继承帮助程序脚本之一。有几个,包括我自己的Lineage.这些脚本可帮助您构建继承层次结构,为您处理管道,以便您可以专注于构建要构建的任何内容。我们只是暂时需要它们;JavaScript 在下一个版本中得到了语法糖来帮助解决这个问题(当然,一旦它真正完成,我们还需要几年时间才能看到对它的广泛支持(。