0

我遇到了原型继承问题,我不知道为什么它不能正常工作。

片段是这样的:

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 的调用可以正常工作。

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

4

2 回答 2

4

错误在代码的最后一行:

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

正确的是:

var res = f.isEmpty();
于 2012-05-11T21:40:11.177 回答
1

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

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

this.base = DoubleField;

...不会按您的意愿工作。考虑 的情况IntegerField。你打电话new IntegerField,它设置this.baseDoubleField调用它。但DoubleField构造函数随后设置this.baseField. 所以你有一个属性指向的IntegerField实例,而不是。baseFieldDoubleField

您不能使用实例属性来跟踪沿袭。它适用于父/子情况,但您会遇到上述“孙子”问题。

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

于 2012-05-11T21:43:44.363 回答