22

次のように、オブジェクト内のプロパティを自動的に実行できることに気付きました。

var obj = {

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

}

このメソッドをオブジェクトの初期化子として使用しようとしています。私が遭遇している問題は、「obj」への参照をinitプロパティに渡すことです。objがまだブラウザに完全に組み込まれていないため、エラーが発生する可能性があります。私は次のことをしようとしていますが、失敗しました。これを行う方法があれば、私はその方法を知りたいです。

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

9 に答える 9

23

同様のオブジェクトの複数のインスタンスを作成したい場合は、単純な古いコンストラクター関数を使用する必要があります (プロトタイプに共有プロパティを入れることを忘れないでください!)。

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

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

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

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

オブジェクト リテラルを使いすぎないでください。オブジェクト リテラルは単純なものを単純にするかもしれませんが、複雑なものは過度に複雑になります。

于 2009-03-08T14:05:52.340 に答える
5

これは不可能です。objは、ブロック全体が解釈されるまで存在しません。

于 2009-03-08T12:15:33.383 に答える
4

簡単な代替案:

var obj = {

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

}.init();
于 2014-02-12T22:24:36.583 に答える
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();
于 2009-03-08T12:46:06.667 に答える
2

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

var obj = {
    prop: function() { alert('This just ran.') },
    init: ( function(){ setTimeout(function(){obj.prop()},50) } )()
}
于 2011-07-04T13:30:29.843 に答える
1

jQueryライクなスタイルで初期化

(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

于 2013-09-28T15:02:03.977 に答える
1

これは、user1575313 によって提出された例の更新です。

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

jsFiddle へのリンク。jsフィドル

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();
于 2014-12-31T17:34:39.013 に答える
0

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

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

オブジェクトリテラルには、セミコロンなしのコンマ区切りのメンバーが必要です。

于 2009-03-08T12:14:18.833 に答える
-1

「this」をinit関数に渡せば機能しますか?

のようなもの:(未テスト)

var obj = {
    prop:function(){ alert('This just ran.'); },
    init:(function(o){ o.prop(); })(this);
}
于 2009-03-08T12:14:12.187 に答える