2013-05-07 10 views
5

オブジェクトする機能を追加し、私は私が使用できるエンドポイントを取得しようとしています次のコード私は上記の機能</p> <p>を呼び出すコードを持っている私は、同じファイルに次のコード</p> <pre><code>var PROMO = PROMO || {}; PROMO.Base = (function() { var _self = this; var Init = function() { WireEvents(); }; var WireEvents = function() { //wire up events }; }()); </code></pre> <p>を持って

$(document).ready(function() { 
    PROMO.Base.Init(); 
}); 

これは、エラーが発生します

Cannot call method 'Init' of undefined 

私はjavascriptを書く多くの方法があることを知っていますが、この場合私は自分の関数を呼び出すことができる、または少なくとも上の方法でInitメソッドを呼び出せます。

+0

でjQueryの

(function($){ var PROMO = { // inner functions Init: function(){}, WireEvents: function(){} }; $.PROMO = PROMO; })(jQuery); 

から依存している場合は、実際に私は 'PROMO.Base.Init' –

答えて

6
var PROMO = PROMO || {}; 

PROMO.Base = (function() { 
    var _self = this; 

    var Init = function() { 
    WireEvents(); 
    }; 

    var WireEvents = function() { 
    //wire up events 
    }; 

    var reveal = { 
     Init: Init   
    }; 

    return reveal; 

}()); 

あなたは公共対向関数を返す必要があります。更新されたコードをご覧ください。

+0

+1これは簡単な閉鎖の素晴らしい例です。よくやった。 – iGanja

+0

@ alex23 this;手元にある問題とは何の関係もなかったので、私は無視しましたか、あまり注意を払っていませんでした。 ;) – iGanja

5

Working fiddle両方のパターンで、IIFEと直接帰属を使用します。

を使用するvarを使用すると、定義がプライベートになり、関数は何も返しません。

PROMO.Base = { 
    Init: function() { 
    }, 
    WireEvents: function() { 
    }; 
}; 

この定義は、IIFE(Immediately Executed Function Expression)でラップしています。したがって、PROMO.Baseオブジェクトには(function(){//blabla})();が返されます。しかし、あなたの関数はreturnステートメントを持っていません。デフォルトではundefinedが返されます。あなたが本当にその生命維持をしたい場合は

Cannot call method 'Init' of undefined 

::ところで、あなたのPROMO.Baseundefinedになり、あなたがこれを取得することです

var PROMO = PROMO || {}; 
// NEVER use _self = this inside static functions, it's very dangerous. 
// Can also be very misleading, since the this object doesn't point to the same reference. 
// It can be easily changed with Function.prototype.call and Function.prototype.apply 
PROMO.Base = (function() { 

    _PROMO = { 
     Init : function() { 
      document.body.innerHTML += "itworks"; 
     }, 
     WireEvents : function() { 
    //wire up events 
     } 
    } 
    return _PROMO; 
}()); 
PROMO.Base.Init(); 

更新

より良く、より容易なパターン単に機能をPROMO.Baseに割り当てるだけです。 Dullyは静的関数を大文字にするべきではなく、コンストラクタのみを大文字にするべきであることに注意してくださいインスタンス化されないものがある場合は、Initとしないでください。initにする必要があります。それが大会です。

var PROMO = {}; 
PROMO.Base = {}; 
PROMO.Base.init = function() { 
    console.log("this works"); 
}; 
PROMO.Base.wireEvents = function() { 
    console.log("this is a static function too"); 
}; 
+0

1に' Init'に保存されている機能がない割り当てられたことはありません;ドリューの方法も有効ですが、これは私の好みの方法です。 – iGanja

+0

...あなたは帰って行きました。もう一度、私は両方の方法が有効だと思う。 – iGanja

+0

非常に良い答え – iGanja

0

あなたがそうであるように、それをロードする...のようなwindowオブジェクトに

window.PROMO = (function($, _){ 

// this will access PROMO.Base 
PROMO.Base = { 
    // inner functions here 
    Init:{} 
}; 

})(jQuery, _); 

それを添付することができます。

それとも、DOM準備

jQuery(function ($) { 
    var promo = $.PROMO || undefined; 
    promo.Base.Init(); 
}); 
関連する問題

 関連する問題