Question

J'ai récemment fait ma propre bibliothèque Javascript et je d'abord le schéma suivant:

var myLibrary = (function () {

  var someProp = "...";

  function someFunc() {
    ...
  }

  function someFunc2() {
    ...
  }

  return {
     func: someFunc,
     fun2: someFunc2,
     prop: someProp;
  }

}());

Le problème est que je ne peux pas vraiment utiliser la complétion de code parce que l'IDE ne connaît pas les propriétés que la fonction littérale est de retour (j'utilise IntelliJ IDEA 9 par la voie).

Je l'ai regardé le code jQuery et essayé de faire ceci:

(function(window, undefined) {
    var myLibrary = (function () {

      var someProp = "...";

      function someFunc() {
        ...
      }

      function someFunc2() {
        ...
      }

      return {
         func: someFunc,
         fun2: someFunc2,
         prop: someProp;
      }

    }());

    window.myLibrary = myLibrary;
}(window));

J'ai essayé, mais maintenant j'ai un autre problème. L'IDE ne capte pas vraiment sur myLibrary soit.

La façon dont je suis résoudre le problème est maintenant de cette façon:

var myLibrary = {
   func: function() { },
   func2: function() { },
   prop: ""
};

myLibrary = (function () {

  var someProp = "...";

  function someFunc() {
    ...
  }

  function someFunc2() {
    ...
  }

  return {
     func: someFunc,
     fun2: someFunc2,
     prop: someProp;
  }

}());

Mais cela semble un peu maladroit, et je ne peux pas comprendre exactement comment jQuery est fait. Une autre question que j'ai est de savoir comment gérer les fonctions avec un nombre arbitraire de paramètres.

Par exemple, jQuery.bind peut prendre 2 ou 3 paramètres, et l'IDE ne semble pas se plaindre. J'ai essayé de faire la même chose avec ma bibliothèque, où une fonction peut prendre 0 ou 1 argument arguments. Cependant, l'IDE se plaint et avertit que le nombre correct de paramètres ne sont pas envoyés. Comment puis-je gérer cela?

EDIT

Je commence à me demander si c'est un problème Idea9 parce que jQuery a le même problème. Je ne semble pas avoir ce problème dans d'autres projets bien.

Était-ce utile?

La solution

J'utilise IDEA avec le modèle de module Yahoo et mes travaux de saisie semi-automatique. Google pour motif de module Yahoo.

http://www.yuiblog.com/blog/ 2007/06/12 / module modèle /

http://ajaxian.com/archives/a-javascript-module-pattern


TEST = function() {
    var SOME_CONSTANT='asd';

    function privateStuff(){
        var a = 'asd';
        return a;
    }

    return{
        someArray:[],

        someMethod: function(foo, bar){

            var foo = *1
        }
        ,

        myProperty:'test'
    }
}();

TEST.*2

avec * 1 et * 2 i marqué les endroits où j'ai essayé autocomplétion.

* 1 je reçois SOME_CONSTANT et méthode privateStuff, et si je mets cela. (Autocomplete) j'avoir accès à toutes les méthodes et propriétés à l'intérieur du bloc return {}

quand je tente autocomplete sur * 2 je reçois toutes les méthodes et propriétés à l'intérieur bloc de retour {}. SOME_CONSTANT et méthode privateStuff sont invisibile là, parce qu'ils sont "privées".

Pour moi, ce niveau de saisie semi-automatique est tout à fait bien.

Autres conseils

Je pense que ce sera bien si vous avez lu quelque chose sur Douglas Crockford. Il est l'architecte dans le cadre yahou YUI. Et après que vous pouvez avoir une meilleure idée de comment construire un grand cadre. Et pour le paramètre il y a 2 options. Par exemple envoyer 1.- objet

{ option :{ var1 : "value" , var2:"value"}, var3 : "value" }

Et vous pouvez vérifier si l'option existe.

Le second pas grand est de vérifier si le paramètre est défini.

function foo(var1,var2){
   var var1_this = null;
     if(var1 != undefined)
      var1_this = var1;
}

et juste un commentaire pourquoi construire un nouveau framework javascript? utilisation Prototype, JQuery, Mootols, YUI. pourquoi réinventer la roue?

Ceci est en réponse aux commentaires poste mwilcox .

Cet exemple va effectivement travailler. Depuis myLibrary est défini sans var, il est automatiquement mis dans l'espace de noms global et accessible en tant que tel. Grâce à la fermeture créée par la fonction d'auto-exécution, les variables privées et les méthodes sont toujours accessibles dans les méthodes de myLibrary. Vous pouvez facilement essayer cela en le mettant en Firebug ou Rhino.

Ces jours-ci, je ne tendent pas à cacher mes variables, à savoir que j'utilise le motif ou le motif pseudo-classique prototypique et le préfixe mon destiné méthodes privées avec un _:

// Pseudoclassical pattern
function Hello() {}
Hello.prototype = {
    method1: function() {},
    method2: function() {},
    _pseudeoPrivate: function() {}
};

/* Prototypal pattern. To create multiple instances of this object,
   you need a helper function such as
    function beget(o) {
        var F = function() {};
        F.prototype = o;
        return new F;
    }
    var instance = beget(world);
*/
var world = {
    method1: function() {},
    method2: function() {}
};

Pour éviter mon code de polluer l'espace de noms global, j'ai un processus de construction qui enveloppe mes modules dans une fermeture et exporte l'api du public à l'espace de noms. Cette technique est également utilisée par jQuery. Vous pouvez voir que dans leur code source (regardez intro.js & outro.js) sur Github .

Cela vous permettra d'utiliser un modèle qui permet à votre IDE (ou ctags avec vim) pour voir votre api, tout en empêchant la pollution de l'espace de nommage global.

J'écris mes bibliothèques comme ceci:

function MyLibrary() {
    // code
}
MyLibrary.prototype.memberFunc = function() {
    // code
}
MyLibrary.prototype.memberVar = 5;

new MyLibrary();

De cette façon, dans Geany (qui utilise CTAGS) MyLibrary est bien reconnu (pour la plupart, par exemple, memberVar est reconnu en fonction) et autocomplétion semble fonctionner. Je ne sais pas IDEA9, mais vous pouvez essayer cette façon (je le pressentiment qu'il est un peu plus évolué que CTAGS).

Je vous recommande de ne pas utiliser des variables privées, mais je comprends que vous voulez les caché de l'IntelliSense. Voici comment je le ferais:

(function(){
    var privateVar = "shhhh!";
    var privateMethod = function(){}


    myLibray = {
        prop:42,
        foo: function(){
            return privateMethod()
        },
        bar: function(){
            return privateVar;
        }
    }

})();

De cette façon, vous pouvez avoir vos affaires privées dans une fermeture et votre bibliothèque doit être accessible.

[édité. Je ne gauchement pas inclus myLibrary dans la fonction anonyme et il ne pouvait pas voir les vars privés. Oops. ]

BTW, mes raisons pour les variables privées étant mauvais: http: // clubajax. org / javascript-privé variables sont-mal /

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top