Frage

ich meine eigene Javascript-Bibliothek vor kurzem gemacht und ich zunächst das folgende Muster verwendet:

var myLibrary = (function () {

  var someProp = "...";

  function someFunc() {
    ...
  }

  function someFunc2() {
    ...
  }

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

}());

Das Problem dabei ist, dass ich nicht wirklich Code-Vervollständigung verwenden kann, weil die IDE nicht wissen, über die Eigenschaften, dass die Funktionsliteral zurückkehrt (Ich benutze IntelliJ IDEA 9 durch die Art und Weise).

Ich habe bei jQuery-Code gesucht und versucht, dies zu tun:

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

      var someProp = "...";

      function someFunc() {
        ...
      }

      function someFunc2() {
        ...
      }

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

    }());

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

Ich habe versucht, aber ich habe jetzt ein anderes Problem. Die IDE ist wirklich nicht abholen auf myLibrary entweder.

So wie ich das Problem bin jetzt lösen, ist auf diese Weise:

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

myLibrary = (function () {

  var someProp = "...";

  function someFunc() {
    ...
  }

  function someFunc2() {
    ...
  }

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

}());

Aber das scheint ein bisschen klobig, und ich kann nicht genau herausfinden, wie jQuery es tut. Eine andere Frage, die ich habe, ist, wie Funktionen zu handhaben mit einer beliebigen Anzahl von Parametern ab.

Zum Beispiel kann jQuery.bind nehmen 2 oder 3 Parameter und die IDE scheinen nicht zu beklagen. Ich habe versucht, das gleiche mit meiner Bibliothek zu tun, wo eine Funktion 0 Argumente oder 1 Argument nehmen könnte. Allerdings wirft die IDE und warnt davor, dass die richtige Anzahl der Parameter nicht in gesendet werden. Wie kann ich damit umgehen?

Bearbeiten

Ich fange an zu fragen, ob dies ein Problem ist, weil Idea9 jQuery hat das gleiche Problem. Ich scheine nicht, obwohl in anderen Projekten, dieses Problem zu haben.

War es hilfreich?

Lösung

Ich bin mit IDEA mit yahoo Modul Mustern und meint die automatische Vervollständigung funktioniert. Google für Yahoo Modul Muster.

http://www.yuiblog.com/blog/ 2007/06/12 / Modul-Muster /

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

mit * 1 und * 2 i Stellen markiert, wo ich auto complete versucht.

in * 1 i erhalten SOME_CONSTANT und privateStuff Methode, und wenn ich diese. (Auto-Vervollständigen) i Zugriff auf alle Methoden und Eigenschaften innerhalb der Rückkehr erhalten {} Block

Wenn ich versuche, die automatische Vervollständigung auf * 2 i erhalten alle Methoden und Eigenschaften innerhalb Rückkehr {} Block. SOME_CONSTANT und privateStuff Verfahren sind invisibile dort, weil sie "privat" sind.

Für mich Niveau der automatischen Vervollständigung ist ganz in Ordnung.

Andere Tipps

denke ich, wird groß sein, wenn Sie etwas über Douglas Crockford lesen. Er ist der Architekt in Yahou YUI Rahmen. Und danach können Sie eine bessere Idee haben, wie man einen großen Rahmen bauen. Und für den Parameter gibt es zwei Optionen. 1.- send über das Objekt Beispiel

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

Und die können Sie überprüfen, ob die Option exist.

Die zweite nicht zu groß ist, zu überprüfen, ob der Parameter nicht definiert ist.

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

und nur ein Kommentar, warum einen neuen JavaScript-Framework bauen? Verwendung Prototype, JQuery, Mootols, YUI. Warum das Rad neu erfinden?

Dies ist in Antwort auf die Kommentare auf mwilcox der Post .

Dieses Beispiel auch tatsächlich funktionieren. Da myLibrary ohne var definiert ist, wird es automatisch in den globalen Namensraum und zugänglich als solche stellen. Durch die Schließung durch die selbstausführende Funktion erstellt, sind die privaten Variablen und Methoden noch zugänglich in den myLibrary Methoden. Sie können diese ausprobieren, indem sie in Firebug oder Rhino setzen.

In diesen Tagen, ich eher nicht meine Variablen verstecken, das heißt ich das pseudoMuster oder das Prototypische Muster und Präfix mein bestimmt private Methoden mit einem _:

// 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() {}
};

Um meinen Code von Verschmutzung der globalen Namensraum zu verhindern, habe ich einen Build-Prozess, dass meine Module in einem Verschluss wickelt und Exporte die öffentliche api auf den Namespace. Diese Technik wird auch von jQuery verwendet. Sie können sehen, dass in ihrem Quellcode (Blick auf intro.js & outro.js) auf Github .

Dies würde ermöglichen es Ihnen, ein Muster zu verwenden, die Ihre IDE ermöglicht (oder ctags mit vim) Ihre api, um zu sehen, während auch die Verschmutzung des globalen Namensraum zu verhindern.

Ich schreibe meine Bibliotheken wie diese:

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

new MyLibrary();

Auf diese Weise in Geany MyLibrary (die ctags verwendet) ist allgemein anerkannt (für den größten Teil, beispielsweise memberVar als Funktion erkannt) und Auto-Vervollständigung scheint zu funktionieren. Ich weiß nicht, über IDEA9, aber man konnte es auf diese Weise versuchen, (ich habe das Gefühl, es als ctags ein bisschen mehr weiterentwickelt wird).

Ich empfehle, dass Sie keine privaten Variablen verwenden, aber ich verstehe Sie sie von der intellisense versteckt werden soll. Dies ist, wie ich es tun würde:

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


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

})();

So können Sie Ihre privaten Sachen in einem Verschluss und Ihre Bibliothek sollte zugänglich sein können.

[bearbeitet. Ich schließe plump nicht mylibrary in der anonymen Funktion, und es könnte die privaten Vars nicht sehen. Hoppla. ]

BTW, meine Gründe für private Variablen sind schlecht: http: // clubajax. org / javascript-private-Variablen-sind-evil /

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top