Javascript原型继承问题

时间:2012-05-11 21:34:56

标签: javascript

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

摘录如下:

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的调用按预期正常工作。

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

2 个答案:

答案 0 :(得分:4)

错误出现在最后一行代码中:

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

正确的是:

var res = f.isEmpty();

答案 1 :(得分:1)

你还没有说 失败了。正如我在评论中指出的那样,至少有一个错字: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在下一个版本中获得syntactic sugar to help with this(当然,在我们看到它的广泛支持之后,它们将在几年前实现最终确定)。