3

最近、独自のJavascriptライブラリを作成し、最初は次のパターンを使用しました。

var myLibrary = (function () {

  var someProp = "...";

  function someFunc() {
    ...
  }

  function someFunc2() {
    ...
  }

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

}());

これに伴う問題は、IDEが関数リテラルが返すプロパティを認識していないため、コード補完を実際に使用できないことです(ちなみに、私はIntelliJ IDEA 9を使用しています)。

私はjQueryコードを見て、これを実行しようとしました:

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

      var someProp = "...";

      function someFunc() {
        ...
      }

      function someFunc2() {
        ...
      }

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

    }());

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

私はこれを試しましたが、今は別の問題があります。IDEは実際にはmyLibraryどちらにも対応していません。

私が今問題を解決している方法は次のとおりです。

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

myLibrary = (function () {

  var someProp = "...";

  function someFunc() {
    ...
  }

  function someFunc2() {
    ...
  }

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

}());

しかし、それはちょっと不格好なようで、jQueryがそれをどのように行っているかを正確に理解することはできません。私が持っているもう1つの質問は、任意の数のパラメーターを持つ関数をどのように処理するかです。

たとえば、jQuery.bind2つまたは3つのパラメータを取ることができ、IDEは文句を言わないようです。私は自分のライブラリで同じことをしようとしました。関数は0個の引数または1個の引数を取ることができます。ただし、IDEは、正しい数のパラメーターが送信されていないことを通知し、警告します。これを処理するにはどうすればよいですか?

編集

jQueryにも同じ問題があるので、これがIdea9の問題であるかどうか疑問に思い始めています。しかし、他のプロジェクトではこの問題は発生していないようです。

4

5 に答える 5

3

私は yahoo モジュール パターンで IDEA を使用しており、オートコンプリートが機能します。Google for yahoo モジュール パターン。

http://www.yuiblog.com/blog/2007/06/12/module-pattern/

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

*1 と *2 で、オートコンプリートを試みた場所をマークしました。

*1でSOME_CONSTANTとprivateStuffメソッドを取得し、これを配置すると(オートコンプリート)、return {}ブロック内のすべてのメソッドとプロパティにアクセスできます

*2 でオートコンプリートを試みると、return {} ブロック内のすべてのメソッドとプロパティが取得されます。SOME_CONSTANT と privateStuff メソッドは「プライベート」であるため、そこでは見えません。

私にとって、そのレベルのオートコンプリートはかなり問題ありません。

于 2010-04-01T23:21:42.623 に答える
1

ダグラス・クロックフォードについて何か読んだら素晴らしいと思います。彼はyahouYUIフレームワークのアーキテクトです。その後、優れたフレームワークを構築する方法について、より良いアイデアを得ることができます。また、パラメータには2つのオプションがあります。1.-オブジェクトを介して送信する例

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

そして、オプションが存在するかどうかを確認できます。

2つ目は、パラメータが未定義かどうかを確認することです。

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

なぜ新しいjavascriptフレームワークを構築するのかコメントだけですか?Prototype、JQuery、Mootols、YUIを使用します。なぜ車輪の再発明をするのですか?

于 2010-04-02T06:07:48.643 に答える
1

これは、mwilcox の投稿へのコメントへの返信です。

その例は実際に機能します。myLibraryは なしで定義されているためvar、自動的にグローバル名前空間に配置され、そのままアクセス可能になります。自己実行関数によって作成されたクロージャーを通じて、メソッド内でプライベート変数とメソッドに引き続きアクセスできmyLibraryます。これを Firebug または Rhino に入れることで簡単に試すことができます。

最近では、変数を非表示にする傾向はありません。つまり、Pseudoclassical パターンまたは Prototypal パターンを使用し、目的のプライベート メソッドの前に_:

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

コードがグローバル名前空間を汚染するのを防ぐために、モジュールをクロージャーでラップし、パブリック API を名前空間にエクスポートするビルド プロセスを用意しています。この手法は jQuery でも使用されます。Githubのソース コード (intro.js と outro.js を参照) で確認できます。

これにより、グローバル名前空間の汚染を防ぎながら、IDE (または vim を使用した ctags) が API を認識できるようにするパターンを使用できるようになります。

于 2010-08-06T09:43:02.647 に答える
0

私は次のようにライブラリを作成します。

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

new MyLibrary();

このように、Geany(CTAGSを使用)MyLibraryではよく認識されており(たとえば、ほとんどの場合、memberVarは関数として認識されます)、オートコンプリートは機能しているようです。IDEA9についてはわかりませんが、この方法で試すことができます(CTAGSよりも少し進化した予感があります)。

于 2010-04-02T17:18:38.020 に答える
0

プライベート変数を使用しないことをお勧めしますが、インテリセンスから非表示にしたいことは理解しています。これは私がそれを行う方法です:

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


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

})();

このようにして、プライベートなものをクロージャーに入れることができ、ライブラリにアクセスできるようになります。

[編集。不器用に無名関数に myLibrary を含めなかったため、プライベート変数を認識できませんでした。おっとっと。]

ところで、プライベート変数が悪い理由: http://clubajax.org/javascript-private-variables-are-evil/

于 2010-04-02T01:30:44.413 に答える