Question

J'ai compris que vous pouvez avoir une propriété dans un objet qui s'exécute automatiquement comme ceci:

var obj = {

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

}

J'essaie d'utiliser cette méthode en tant qu'initialiseur pour l'objet. Le problème que je rencontre est de passer une référence à 'obj' à la propriété init. Je soupçonne que cela génère des erreurs parce que l'obj n'a pas encore été complètement construit J'essaie de faire ce qui suit, mais sans succès. S'il existe un moyen de le faire, j'aimerais savoir comment.

var obj = {
    prop:function(){ alert('This just ran.'); },
    init:(function(){ obj.prop(); })();
}
Était-ce utile?

La solution

Si vous souhaitez créer plusieurs occurrences d'objets similaires, vous devez utiliser de vieilles fonctions de constructeur simples (n'oubliez pas de placer les propriétés partagées dans le prototype!).

Si vous souhaitez créer un seul objet, envisagez d'utiliser un constructeur anonyme. Votre exemple se lirait comme suit:

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

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

Cela présente un avantage supplémentaire par rapport aux littéraux d'objet: la fonction constructeur peut être utilisée comme une fermeture sur des variables "privées".

N'abusez pas des littéraux d'objet: ils simplifient les choses simples, mais les choses complexes deviennent trop compliquées.

Autres conseils

Cela n’est pas possible: obj n’existe pas tant que tout le bloc n’est pas interprété.

Une alternative simple:

var obj = {

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

}.init();

Pourquoi n'utilisez-vous pas le modèle constructeur (en fait, je n'ai aucune idée de son nom correct):

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;
    };
}

Utilisation:

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

Oui, obj ne semble exister localement que plus tard. Cela a fonctionné pour moi avec setTimeout . Testé ok sur IE8, FF5, Chrome 12 et Opera v11.5. Pas sûr des 50 millisecondes, j'imagine que ça suffit.

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

ceci est une mise à jour de l'exemple soumis par l'utilisateur1575313.

le code d'origine fonctionne, mais il limite l'utilisation de l'objet après l'installation. En renvoyant la référence de l'objet dans la méthode init, cela permet à l'objet d'être utilisé en dehors de l'objet.

lien vers 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();

Initié dans un style semblable à 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

Je pense que vous voulez essayer quelque chose comme ceci:

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

Les littéraux d'objet nécessitent des membres séparés par des virgules sans point-virgule.

Est-ce que ça marche si vous passez "ça"? dans la fonction init?

quelque chose comme: (non testé)

var obj = {
    prop:function(){ alert('This just ran.'); },
    init:(function(o){ o.prop(); })(this);
}
Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top