4

ある種の名前空間手法を使い始めないと、コードが混乱してしまいます。私は大規模なjavascriptプロジェクトのプログラミングに比較的慣れていませんが、C ++ / java/pythonなどでのシステムプログラミングの経験が豊富です。

基本的に、私はjavascript名前空間を作成するための好ましい方法と、各方法の長所/短所を特定しようとしています。

たとえば、次の3つの方法のいずれかを使用できます。

var proj.lib.layout = {
  "centreElem":     
  function (elem, W, H){

  },

  "getAbsolutePosition":
  function (elem){

  }
};

また

var proj.lib.layout = {};
(function(){
  var l = proj.lib.layout;

  l.centreElem = function (elem, winW, winH){
    ..
  }

  l.getAbsolutePosition = function (elem){
    ..
  }
})();

また

var proj.lib.layout = new function(){
  function centreElem(elem, W, H){
    ..
  }

  function getAbsolutePosition(elem){
    ..
  }

  this.centreElem          = centreElem;
  this.getAbsolutePosition = getAbsolutePosition;
} ();

それを明らかにする方法は他にもありますが、私が最初に見て考えたのはこれらの方法でした。誰かが「最高の」テクニックがあると言うことができますか、または少なくとも私が私に最適なものを評価できるいくつかの賛否両論に私を向けることができますか?

4

4 に答える 4

3

次のようなサブオブジェクトに割り当てる前に、すべての中間オブジェクトを作成する必要があることに注意してください。

window.one.two.three = {}; // fails
window.one = { two: { three: {} } };

名前空間コードを統一できるように、名前空間メソッドを作成することを検討してください。例えば:

window.proj = {};
// n - {String} - A string representing a namespace to create on proj
// returns an object you can assign values to
window.proj.namespace = function(n) { /* ... */ };

(function(NS) {
    NS.myMethod = function() {};
    NS.myOtherMethod = function() {};
    NS.myProperty = "FOO";
})(proj.namespace('lib.layout'));

assert(proj.lib.layout.myProperty === "FOO");
于 2011-07-01T15:20:39.020 に答える
1

私の好みの方法は、他のすべてのオブジェクトを含む名前空間として、単一のオブジェクト(通常、名前は短く、2〜3文字で、すべて大文字)を使用することです。

以下に示す方法(2番目の例に最も近い方法)は、プライベート関数を非表示にする方法も示しています。

// In this example the namespace is "QP"
if (!QP) {
    var QP = {};
};

// Define all objects inside an closure to allow "private" functions
(function() {

     QP.examplePublicFunction = function() {
         ...
     }

     function examplePrivateFunction() {
         ...
     }

})();

これは、 json2.jsなどの他の多くのJavaScriptライブラリで使用されるメソッドです。

名前空間をサブ名前空間に分割する必要性を実際に感じたことはありません。

于 2011-07-01T15:03:34.990 に答える
0

基本的に、3つの例はすべて同じ「名前空間」手法を使用します。つまり、基本オブジェクト(名前空間)を作成し、それを関数で拡張します。

通常、ルート名前空間は大文字です。

if (typeof (MYAPP) == "undefined" || !MYAPP) {
    var MYAPP= {}
};

次に、さまざまな方法でこのベースオブジェクトに機能を追加できます。コードでは、そのうちの3つを示していますが、それぞれが同じ結果になる場合は、次の2つの関数を呼び出すことができます。

proj.lib.layout.centreElem(elem, W, H);
proj.lib.layout. getAbsolutePosition(elem);
于 2011-07-01T15:04:20.380 に答える
0

Google Closure Javascript Libraryはこの スタイルを使用しています(これはあなたの例のどれともまったく同じではありません)

goog.math.clamp = function(value, min, max) {
  return Math.min(Math.max(value, min), max);
};

私はこのシンプルなスタイルに固執します。自己実行型の無名関数ラッパーを気にしないでください。あなたの例のものは実際には何も役に立ちません。

于 2011-07-01T15:05:36.570 に答える