2011-10-19 36 views
0

みんな!サブクラスからスーパークラスのインスタンス変数にアクセスするには?

私は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 
    } 

クラス?

ありがとうございます。

マルコス

UPDATED:あなたは実際のコードを見たい場合はまあ、ここにあります。問題は、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

ワンノート::; ''あなたのCat'コンストラクタで、本当に何もしないライン 'Animal.call(本)あなたの例にこれを適用する

はこのような何かを作り出します。これはJavaではありません。 「スーパー」に類似するものは何もない。 –

+0

@lwburk - この記事は反対です:[記事](https://developer.mozilla.org/en/Introduction_to_Object-Oriented_JavaScript) – Marcos

+0

本当のスーパーは魔法の "this"変数のように動作し、誰がスーパークラスitsefです。スーパー機能をエミュレートするJavascriptでは、スーパークラスからメソッドを「統計的にディスパッチする」必要があります。 btw、あなたは私たちが見ることができるものから間違って何もしていないので、JSFiddleで実行中の例を取得しようとする必要があります。 – hugomg

答えて

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] 

この2番目の例では、変数tを閉じて、その参照を保持しています。

function PesquisaAcervo() { 
    var that = this; 
    var callback = function() { 
     that.materialMudado(); 
    }; 
    $("*:visible[id^='form:materiaisPesquisa']"). 
     change(callback).keyup(callback); 

    this.abc = 10; 
} 
+0

非常に、非常に微妙な問題。ありがとう、lwburk。 – Marcos

+1

私は_ $。proxy()_ユーティリティを発見しました。これは、コンテキストが失われたこのようなユースケース向けに設計されています。これは次のように単純化することができます: '$(" *:visible [id^= 'form:materiaisPesquisa'] ")。これ).change();}); '。 – Marcos

0

this.nameが有効です。 Cat関数のnameプロパティをオーバーライドしているとは思わないので、this.nameを実行できるはずです。プロトタイプのチェーンは、Animal.nameであるこのプロパティの最初のインスタンスを見つけるための作業を行います。

+0

私はちょうどCatメソッドからalert(this.name)を使うと "undefined"と報告します。 – Marcos

+1

@Marcos - 新しいCatインスタンスをどうやって作りますか? –

+0

@lwburk - var animal = new Cat(); – Marcos

0

ただ、このキーワードを使用します。

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方法にあなたの例では

をアラートを追加した、猫からすべてを引き出します動物のため、名前変数にアクセスできます

+0

奇妙なことに、Catメソッドのname変数にはアクセスできません。私が言ったように、それは "未定義"です。これは私にとって非常に直感的ではありません。 – Marcos

+0

コードを実行しましたか? lwburkがすでにあなたに尋ねたように - Catインスタンスをどのように作成していますか?あなたは確かに新しいキーワードを使用しますか? – Nikoloff

+0

@Niloloff - はい、私は昨日から私のコードを実行していました。成功することなく様々な方法で修正しました。 – Marcos

0

インスタンス変数の上書きはありません。インスタンス変数は、thisオブジェクトの単なるプロパティです。あなたがそれを読むことができます。

var x = this.name; 

かでそれに割り当てる:あなたはAnimalオブジェクトのインスタンスまたはCatオブジェクトのインスタンスを持っているかどうかを名前にアクセスする

this.name = "foo"; 

this.name。あなたはCatコンストラクタでnameプロパティに割り当てる場合は

、あなたはちょうどあなたがオブジェクトの作業インスタンスを作成したら、プロパティはプロパティだけです

this.name = "Cat"; 

でそうすることができると区別はありませんスーパークラスまたはサブクラスによってプロパティが作成されたかどうか。それらはその時点のオブジェクトのプロパティに過ぎず、this.propertyName構文で同じ方法ですべてにアクセスします。

関連する問題