我遇到了原型继承的问题,我无法找出它为什么不能正常工作。
摘录如下:
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的调用按预期正常工作。
我无法意识到我做错了什么。任何帮助将不胜感激!
答案 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(当然,在我们看到它的广泛支持之后,它们将在几年前实现最终确定)。