2012-03-01 9 views
0

オブジェクトがあります。oとし、oという参照をします。どうすればobject == this、しかしobject.member!= this.member in Javascript?

oの範囲内でメンバーを設定し、mとしましょう。

ので、Oで、私は呼ん:Oの外

o.m = "blah" 

、私はmにアクセス:

私に "何とか" ではない何かを与える
console.log(o.m) 

。私はした:

console.log(this == this.parent.o) 

これは本当を返します。これはどのように可能ですか?

this.m = "blah" 
console.log(this.m) // prints "blah" 

が、その範囲を出た後にして実行します:

console.log(o.m) 
私は

EDIT

はまた、私はオブジェクトo以内に試してみたクローム17.0.963.56 mを使用しています

別のものをプリントします。

関連するコード(this.addEventを参照してください( "playPauseButtonClicked")):あなたがoの中にいる、とあなたはmを設定したい場合は

// Controller code (singleton) 
    function controller() { 
     if (window.c) { return window.c; } 
     window.c = this; 
    ... 
     // Event handling 
     this.addEvent = function(eventName, callback) { 
      if (!this.events[eventName]) this.events[eventName] = []; 

      this.events[eventName].push(callback); 
     } 
     this.raiseEvent = function(eventName) { 
      self = getController(); 
      if (self.events[eventName]) { 
       var callbacks = self.events[eventName]; 
       var i = 0; 
       for (i = 0; i<callbacks.length; ++i) { 
        callbacks[i](); 
       } 
      } 
     } 

     this.musicplayer = new zeitgeistPlayer(this, this.songStatus); 
    ... 
     this.addEvent("playPauseButtonClicked", function() { 
      var controller = getController(); 
      var musicplayer = controller.musicplayer; 
      switch (musicplayer.state) { 
       case "paused": 
        musicplayer.resume(); 
        controller.view.setButtonProperty("playPauseButton", "pause", true); 
        break; 
       case "playing": 
        musicplayer.pause(); 
        controller.view.setButtonProperty("playPauseButton", "pause", false); 
        break; 
       case "stopped": 
        controller.playSong(); 
        controller.view.setButtonProperty("playPauseButton", "pause", true); 
        break; 
      } 
     }); 

     if (this.playQueue.length == 0) this.view.setButtonProperty("playPauseButton", "disabled", true); 

     this.raiseEvent("controllerLoaded"); 
    } 

    // Functional classes 
    function basePlayer(songStatus) { 
     this.state = "stopped"; // states are: stopped, playing, paused 
    ... 
    } 

    // implementation of basePlayer using the zeitgeist flash player 
    function zeitgeistPlayer(controller, songStatus) { 
     $.extend(this, new basePlayer(songStatus)); 
    ... 
     this.controller = controller; 

    ... 

     this.pause = function() { 
      if (this.controller.debug) console.log("player pausing"); 
      this.state = "paused"; 
      this.swf.pauseSong(); 
      if (this.controller.debug) console.log("player "+this.state); 
      console.log(this); 
      console.log(getController().musicplayer); 
      console.log(this==getController().musicplayer); 
     } 
    ... 
    } 
+2

コンソールを必要とthis.p

  • を使用する必要があなたの質問は、現実的なテストケースで、より良い言葉で表現された場合、私はあなたに答えを与えることができる – Joe

  • +0

    を、リアルタイムではありません。今のところ、 'var a = {a: 'h'}、b = {a: 'h'}; console.log(a.a == b.a); 'は私に真実を返します。 – Christian

    +0

    変数を初期化する必要があります。 'var o =新しいobj; console.log(o.m); ' – Relic

    答えて

    2

    は、あなたが言う:

    this.m = "blah"; 
    

    ooの範囲が他のものになる可能性があります。そのため、物事が期待どおりに動作しないのです。


    EDIT 2 - OPはちょうど彼の質問を変えたように見えますので、おそらく以下のコードはもう関係ありません - ため息


    EDIT

    いくつかの問題があるようです。 1の場合:あなたは未定義のpに関するエラーを取得している理由は、コントローラ、ために何をで渡していない

    function player(controller) { 
        this.controller = controller; 
    

    のようなプレーヤーのコンストラクタが見え

    this.p = new player(); 
    

    。あなたは - あなたはその後、上からthis.pとしてそれを参照する必要がthis.p = new player(this)オブジェクト - リターンの財産であることをpを定義したら、あなたのコントローラのコンストラクタで、また

    this.p = new player(this); 
    

    ;:これを試してみてくださいp自体は宣言されていません。だから、

    function controller() { 
        this.p = new player(this); 
        p.changeState(); 
        console.log(p.state); 
    

    あなたは、変数を初期化する必要があり

    function controller() { 
        this.p = new player(this); 
        this.p.changeState(); 
        console.log(this.p.state); 
    
    +0

    私もそれを試みました。 – brandon

    +0

    @dookehster - フルコードを投稿できますか –

    +0

    @dookehster - あなたの編集が表示されますが、あなたは 'o'の定義全体を投稿できますか? –

    0

    する必要があります。

    var x = new o; console.log(o.m);

    +2

    ハァッ! (より弱い)等価演算子が失敗した場合、(より厳しい)アイデンティティ演算子はどのように機能すると思いますか? – Christian

    +0

    彼はそれが偽に戻ることを望んでいるので...おそらく私は彼が実際にここで何をしようとしているのか、彼の実際の質問は何か分からない – Relic

    0

    私は

    this.p = new player(); 
    p.changeState(); 
    console.log(p.state); 
    

    this.p = new player(this); 
    this.p.changeState(); 
    console.log(this.p.state); 
    

    への変更変更したい:

    1. pは、そのコンテキスト内のローカル変数として存在していないが - - 君は プレーヤーのコンストラクタは、コントローラの参照に
    関連する問題