Escritura de una biblioteca de Javascript que es el código de finalización y el código de inspección de usar

StackOverflow https://stackoverflow.com/questions/2564032

Pregunta

Hace poco hizo que mi propia biblioteca de Javascript y al principio utilizó el siguiente patrón:

var myLibrary = (function () {

  var someProp = "...";

  function someFunc() {
    ...
  }

  function someFunc2() {
    ...
  }

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

}());

El problema con esto es que no puedo utilizar la finalización de código debido a que el IDE no sabe acerca de las propiedades que la función está volviendo literal (estoy usando IntelliJ IDEA 9 por cierto).

He mirado en código jQuery y trató de hacer esto:

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

      var someProp = "...";

      function someFunc() {
        ...
      }

      function someFunc2() {
        ...
      }

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

    }());

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

He intentado esto, pero ahora tengo un problema diferente. El IDE en realidad no recoger en myLibrary tampoco.

La forma en que estoy resolver el problema ahora es de esta manera:

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

myLibrary = (function () {

  var someProp = "...";

  function someFunc() {
    ...
  }

  function someFunc2() {
    ...
  }

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

}());

Pero eso parece un poco torpe, y no puedo encontrar la manera exactamente jQuery lo está haciendo. Otra pregunta que tengo es cómo manejar las funciones con un número arbitrario de parámetros.

Por ejemplo, jQuery.bind puede tomar 2 o 3 parámetros, y no parece el IDE para quejarse. Traté de hacer lo mismo con mi biblioteca, donde una función podría tomar argumentos 0 o 1 argumento. Sin embargo, el IDE se queja y advierte que el número correcto de parámetros no están siendo enviado. ¿Cómo puedo manejar esto?

Editar

Me estoy empezando a preguntarse si esto es un problema porque Idea9 jQuery tiene el mismo problema. No parecen tener este problema en otros proyectos sin embargo.

¿Fue útil?

Solución

Estoy usando IDEA con el patrón de módulo de yahoo y mis trabajos de autocompletar. Google para el patrón de módulo de yahoo.

http://www.yuiblog.com/blog/ 2007/06/12 / módulo de patrón /

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

con * 1 y * 2 i marcados lugares en los que he intentado auto completo.

en * 1 Me SOME_CONSTANT y el método privateStuff, y si pongo esto. (Autocompletar) i obtener acceso a todos los métodos y propiedades en el interior de la vuelta {} bloque

cuando intento autocompletar en 2 * i obtener todos los métodos y propiedades en el interior de retorno {bloque}. SOME_CONSTANT y el método privateStuff son invisibile allí, porque son "privado".

Para mí ese nivel de autocompletar es bastante bien.

Otros consejos

creo que va a ser grande si usted lee algo sobre Douglas Crockford. Es el arquitecto en Yahou marco YUI. Y después de que se puede tener una mejor idea de cómo construir un gran marco. Y para el parámetro hay 2 opciones. 1.- Enviar a través de ejemplo el objeto

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

Y el se puede comprobar si la opción de existir.

El segundo no a grande es de verificación si no está definido el parámetro.

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

y sólo un comentario por qué construir un nuevo marco de JavaScript? el uso de prototipos, jQuery, Mootols, YUI. ¿Por qué reinventar la rueda?

Esto es en respuesta a los comentarios a de mwilcox posterior .

Ese ejemplo funcione de verdad. Desde myLibrary se define sin var, se pone automáticamente en el espacio de nombres global y accesible como tal. A través del cierre creado por la función de aplicación directa, las variables y métodos privados siguen siendo accesibles en los métodos myLibrary. Usted puede tratar fácilmente esto poniéndolo en Firebug o Rhino.

En estos días, que no tienden a ocultar mi variables, es decir, que utilice el patrón Pseudoclassical o el patrón de prototipos y el prefijo de mi destinado métodos privados con 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() {}
};

Para evitar que mi código de contaminar el espacio de nombres global, que tiene un proceso de construcción que envuelve mis módulos en un cierre y las exportaciones de la API pública para el espacio de nombres. Esta técnica también es utilizado por jQuery. Se puede ver que en su código fuente (ver intro.js y outro.js) en Github .

Esto permitirá utilizar un patrón que permite su IDE (o ctags con vim) para ver su API, y por otro evitar la contaminación del espacio de nombres global.

escribo mis bibliotecas de esta manera:

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

new MyLibrary();

De esta manera, en Geany (que utiliza ctags) MyLibrary es bien reconocido (en su mayor parte, por ejemplo, memberVar es reconocido como una función) y autocompletar parece funcionar. No sé sobre IDEA9, pero se puede tratar de esta manera (tengo el presentimiento que es un poco más evolucionado que CTags).

Le recomiendo que no utiliza variables privadas, pero entiendo que usted quiere que ocultan al IntelliSense. Esta es la forma en que lo haría:

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


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

})();

De esta manera usted puede tener su material privado en un cierre y su biblioteca debe ser accesible.

[editado. Torpemente no incluí mylibrary en la función anónima y no podía ver los VARs privadas. Uy. ]

Por cierto, mis razones para variables privadas ser malo: http: // clubajax. org / javascript-variables-privadas-son-mal /

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top