大家!
假设我在JavaScript中使用此类:
function Animal()
{
this.name = "name";
}
Animal.prototype.someMethod =
function ()
{
}
和这个子类:
function Cat()
{
Animal.call(this);
}
Cat.prototype = new Animal();
Cat.prototype.constructor = Cat;
Cat.prototype.someMethod =
function ()
{
// I want to access the superclass "name" instance variable here
}
从Cat类的overriden方法访问超类“name”实例变量的语法是什么?
谢谢。
马科斯
更新:好吧,如果您想查看真实代码,请点击此处。问题出在 abc 变量(只是我正在使用的测试变量)。
var pesquisaAcervo;
$(
function ()
{
carregadoBase();
if ($("#form\\:tipoPesquisa").val() == "SIMPLES")
{
pesquisaAcervo = new PesquisaAcervoSimples();
}
else
{
pesquisaAcervo = new PesquisaAcervoAvancada();
}
pesquisaAcervo.paginaCarregada();
}
);
// --- PesquisaAcervo ----------------------------------------------------------
function PesquisaAcervo()
{
$("*:visible[id^='form:materiaisPesquisa']").
change(this.materialMudado).keyup(this.materialMudado);
this.abc = 10;
}
PesquisaAcervo.prototype.paginaCarregada =
function ()
{
$("#cabecalhoPesquisa a").click(this.exibirDicasPesquisa);
$("#cabecalhoPesquisa select").
change(function () {$("#form").submit();}).
keyup(function () {$(this).change();});
$("*:visible[class*='foco']").focus().select();
};
PesquisaAcervo.prototype.materialMudado =
function ()
{
};
PesquisaAcervo.prototype.exibirDicasPesquisa =
function ()
{
};
// --- PesquisaAcervoSimples ---------------------------------------------------
function PesquisaAcervoSimples()
{
PesquisaAcervo.call(this);
$("#form\\:campos").change(
function ()
{
$("#textoCampo").text($("#form\\:campos :selected").text() + ":");
}
).keyup(function () {$(this).change();}).change();
$("#pesquisaSimples a").click(
function ()
{
pesquisaAcervo = new PesquisaAcervoAvancada();
$("#pesquisaSimples").parent().hide();
$("#pesquisaAvancada").parent().show();
$("#form\\:tipoPesquisa").val("AVANCADO");
}
);
}
PesquisaAcervoSimples.prototype = new PesquisaAcervo();
PesquisaAcervoSimples.prototype.constructor = PesquisaAcervoSimples;
PesquisaAcervoSimples.prototype.materialMudado =
function ()
{
alert(this.abc); // "undefined" here
};
// --- PesquisaAcervoAvancada --------------------------------------------------
function PesquisaAcervoAvancada()
{
PesquisaAcervo.call(this);
}
PesquisaAcervoAvancada.prototype = new PesquisaAcervo();
PesquisaAcervoAvancada.prototype.constructor = PesquisaAcervoAvancada;
答案 0 :(得分:1)
您的实际代码会显示问题。问题在于您如何调用materialMudado
。它被调用作为事件的回调。回调中的关键字this
将引用事件的目标(没有abc
属性),而不是函数“所属”的对象。
这是一个简单的演示:
function Test() {};
Test.prototype.callback = function() {
alert(this);
}
var t = new Test();
$(document).click(t.callback);
输出(点击页面后):
[object HTMLDocument]
与此相比:
function Test() {};
Test.prototype.callback = function() {
alert(this);
}
var t = new Test();
$(document).click(function() {
t.callback();
});
输出:
[object Object]
在第二个例子中,我们关闭变量t
,保留对它的引用。
将此应用于您的示例会产生以下内容:
function PesquisaAcervo() {
var that = this;
var callback = function() {
that.materialMudado();
};
$("*:visible[id^='form:materiaisPesquisa']").
change(callback).keyup(callback);
this.abc = 10;
}
答案 1 :(得分:0)
this.name
应该有效。我没有看到你覆盖了你的Cat函数中的name属性,所以你应该能够只做this.name
并且protopical链将完成这个属性的第一个实例,它应该是{{1} }。
答案 2 :(得分:0)
只需使用this关键字:
function Animal()
{
this.name = "name";
}
Animal.prototype.someMethod2 =
function ()
{
}
function Cat()
{
Animal.call(this);
}
Cat.prototype = new Animal();
Cat.prototype.constructor = Cat;
Cat.prototype.someMethod =
function ()
{
alert(this.name);// I want to access the superclass "name" instance variable here
}
var c = new Cat();
c.someMethod();
将此代码添加到底部,我刚刚为您的someMethod
方法添加了提醒...
在您的示例中,Cat从Animal派生所有内容,因此它可以访问名称变量
答案 3 :(得分:0)
没有对实例变量进行覆盖的事情。实例变量只是this
对象上的属性。您可以阅读:
var x = this.name;
或分配给:
this.name = "foo";
无论您拥有this.name
对象的实例还是Animal
对象的实例, Cat
都将访问该名称。
如果要分配到name
构造函数中的Cat
属性,可以使用
this.name = "Cat";
一旦有了一个对象的工作实例,属性就是属性,并且属性是由超类还是子类创建没有区别。它们只是该对象的属性,您可以使用this.propertyName
语法以相同的方式访问所有这些属性。