次のようにして、オブジェクトのプロパティを自動的に実行できることに気づきました。
var obj = {
init:(function(){ alert('loaded');})();
}
このメソッドをオブジェクトの初期化子として使用しようとしています。私が遭遇している問題は、 'obj'への参照をinitプロパティに渡すことです。 objはまだブラウザに完全に組み込まれていないため、エラーが発生するのではないかと思います。私は次のことをしようとしていますが、失敗しました。これを行う方法がある場合は、方法を知りたいです。
var obj = {
prop:function(){ alert('This just ran.'); },
init:(function(){ obj.prop(); })();
}
類似したオブジェクトの複数のインスタンスを作成する場合は、プレーンな古いコンストラクター関数を使用する必要があります(プロトタイプに共有プロパティを配置することを忘れないでください!)。
単一のオブジェクトを作成する場合は、匿名コンストラクターの使用を検討してください。あなたの例は次のようになります:
var obj = new (function() {
this.prop = function() {
alert('This just ran.');
}
// init code goes here:
this.prop();
});
これには、オブジェクトリテラルに対する追加の利点があります。コンストラクタ関数は、「プライベート」変数のクロージャとして使用できます。
オブジェクトリテラルを使いすぎないでください。単純なものは単純になりますが、複雑なものは非常に複雑になります。
これは不可能です。ブロック全体が解釈されるまで、objは存在しません。
簡単な代替案:
var obj = {
init: function(){
alert('loaded');
}
}.init();
なぜあなたは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();
はい、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) } )()
}
これは、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();
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();
})();
私はあなたがこのようなことを試したいと思います:
var obj = {
prop: function() { alert('This just ran.'); },
init: function() { obj.prop(); }
}
オブジェクトリテラルでは、セミコロンのないカンマ区切りのメンバーが必要です。