web-dev-qa-db-ja.com

JavaScript-オブジェクト初期化子?

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

var obj = {

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

}

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

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

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

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

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

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

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

オブジェクトリテラルを使いすぎないでください。単純なものは単純になりますが、複雑なものは非常に複雑になります。

22
Christoph

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

5
Maurice Perry

簡単な代替案:

var obj = {

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

}.init();
4
user1575313

なぜあなたはcontructorモデルを使用しないのですか(実際、私はその正しい名前を知りません):

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();
3
James

はい、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) } )()
}
2
John

これは、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();
1
tech-e

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

1
hlcs

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

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

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

0
Andrew Hare