如何从子类访问超类实例变量?

时间:2011-10-19 18:30:16

标签: javascript class

大家!

假设我在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;

4 个答案:

答案 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语法以相同的方式访问所有这些属性。