2009-03-08 8 views
18

私はあなたがこのように自動的に実行オブジェクトのプロパティを持つことができます実現してきました:Javascript - オブジェクトの初期化?

var obj = { 

    init:(function(){ alert('loaded');})(); 

} 

私は、オブジェクトの初期化子として、このメソッドを使用しようとしています。私が実行している問題は、 'obj'への参照をinitプロパティに渡すことです。 objがまだブラウザに完全に組み込まれていないので、エラーが発生すると思われます。私は次のことをしようとしていますが、失敗しています。これを行う方法がある場合、私はどのように知ることが大好きです。

var obj = { 
    prop:function(){ alert('This just ran.'); }, 
    init:(function(){ obj.prop(); })(); 
} 

答えて

21

同様のオブジェクトでは、普通の古いコンストラクタ関数を使うべきです(共有プロパティをプロトタイプに入れてください!)。

単一のオブジェクトを作成する場合は、匿名のコンストラクタを使用することを検討してください。あなたの例は次のようになります。

var obj = new (function() { 
    this.prop = function() { 
     alert('This just ran.'); 
    } 

    // init code goes here: 
    this.prop(); 
}); 

これは、オブジェクトリテラルを超える追加の利点があります。コンストラクタ関数は、「プライベート」変数の上にクロージャとして使用することができます。

オブジェクトリテラルを過度に使用しないでください:単純なものは単純にすることができますが、複雑なものは過度に複雑になります。

+0

これらの匿名のコンストラクタに関するドキュメントをどこから見つけることができますか? –

+1

@JW、私は、匿名のコンストラクタは、コンストラクタ(つまり、 'new'キーワードで呼び出される)として使用されている無名関数であると考えています。 http://stackoverflow.com/questions/20057431/javascript-anonymous-constructor-function-functionおよびhttp://enfinery.com/30/javascript-the-case-of-an-anonymous-constructor – iX3

-1

「this」をinit関数に渡すと機能しますか?以下のような

何か:セミコロンなし

var obj = { 
    prop: function() { alert('This just ran.'); }, 
    init: function() { obj.prop(); } 
} 

オブジェクトリテラルreqireカンマで区切られたメンバー:(未テスト)

var obj = { 
    prop:function(){ alert('This just ran.'); }, 
    init:(function(o){ o.prop(); })(this); 
} 
+2

Nah。 (これは)window.objectへの参照です – Geuis

+1

直接関係はありませんが、素早くプロトタイプを作成し、http://jsfiddle.net/ – Audrius

0

は、私はあなたがこのような何かを試してみたいと思います。

+0

を使ってテストすることができますが、作成時にinit関数を実行することはありません。 –

+0

あなたはそうです - isnオブジェクトリテラルでそれを行う方法はありません。 –

5

これはできません。objはブロック全体が解釈されるまで存在しません。

3
あなたはコンストラクタモデルを使用します(実際には、私はその正しい名前の分からない)していないのはなぜ

function Obj() { 
    // Initialising code goes here: 
    alert('Loaded!'); 

    // ... 

    // Private properties/methods: 
    var message = 'hello', 
     sayHello = function() { 
      alert(message); 
     }; 

    // Public properties/methods: 
    this.prop = function() { 
     sayHello(); 
    }; 

    // Encapsulation: 
    this.setMessage = function(newMessage) { 
     message = newMessage; 
    }; 
} 

使用法:あなたはの複数のインスタンスを作成したい場合は

var instance = new Obj(); 
instance.setMessage('Boo'); 
instance.prop(); 
+0

コンストラクタで初期化しない理由は、プロトタイプ(例えば、サブクラスを作成する)を必要とするたびにコンストラクタを呼び出す必要があるということです - function XObj(){...}; XObj.prototype = new Obj();.この場合、実際のインスタンスを初期化する必要はありません。興味深い。 – bobince

2

はい、objは後でローカルに存在しないようです。これはsetTimeoutと私のために働いた。 IE8、FF5、Chrome 12、Opera v11.5でokをテストしました。しかし、50ミリ秒についてはわかりませんが、十分だと思います。

var obj = { 
    prop: function() { alert('This just ran.') }, 
    init: (function(){ setTimeout(function(){obj.prop()},50) })() 
} 
+0

こちらもご覧ください'var'文の後の次の行が' obj.prop'を使う必要がある場合には動作しません。 – nnnnnn

1

jQueryのようなスタイルでのInit

(function() { 

var $ = function(){ 
    return new $.fn.init(); 
}; 

$.fn = $.prototype = { 
    init: function(){ 
    this.prop(); 
    }, 
    i: 0, 
    prop: function(){ 
    alert('This just ran. Count: ' + (++this.i)); 
    return this; 
    } 
}; 

$.fn.init.prototype = $.fn; 

$().prop().prop(); 

})(); 

jsbin.com

4

簡単な代替:

var obj = { 

    init: function(){ 
    alert('loaded'); 
    } 

}.init(); 
+2

これは 'init()'が返す値に 'obj'を設定することに注意してください。この例では' undefined'です。 – nnnnnn

1

これはuser1575313から提出された例のアップデートです。

元のコードは動作しますが、セットアップ後にオブジェクトの使用が制限されます。initメソッドでオブジェクト参照を返すことで、オブジェクトをオブジェクトの外側で使用することができます。

jsFiddleへのリンク。 jsFiddle

var obj = { 

init: function() 
{ 
    alert('loaded'); 

    this.consoleLog(); 

    /* we want to return this to keep object 
    usable after auto init */ 
    return this; 
}, 

consoleLog: function() 
{ 
    console.log(1); 
} 

}.init(); 

/* the obj should now be usable outside the auto init */ 
obj.consoleLog(); 
関連する問題