0

Stoyan Stefanov の JavaScript ネームスペース関数を実装しているのは、彼の非常に有益な JavaScript パターンの本を読んでいるためです。私のWebアプリケーションでは、適切な方法で使用しているかどうかわかりません

これは、このページのWebアプリで使用している関数の実装ですhttp://dalydd.com/projects/module_example/

     var COOP = COOP || {};

    COOP.namespace = function (ns_string) {
    var parts = ns_string.split('.'),
    parent = COOP,
    i;
     // strip redundant leading global
    if (parts[0] === "COOP") {
        parts = parts.slice(1);
    }
    for (i = 0; i < parts.length; i += 1) {
    // create a property if it doesn't exist
        if (typeof parent[parts[i]] === "undefined") {
            parent[parts[i]] = {};
        }

        parent = parent[parts[i]];
    }
    return parent;
};


     COOP.namespace('sliderContainer')
     COOP.sliderContainer = function () {
     return slider = ($('#slider').length > 0) ? $('#slider') : $('#element_temp'); 
}   // we need this at the beginning as others are dependent on it and call it initially

私の目標は、COOP のすべての新しいプロパティをチェックして、実装する前に存在するかどうかを確認することです --- したがって、COOP.sliderContainer という名前の COOP のプロパティを作成する場合、COOP.sliderContainer がまだ存在しないことを確認したいと思います。名前空間関数を使用するとオブジェクトが返されますが、COOP.sliderContainer は関数です。この名前空間関数に適切に名前を付けるには、抽象化の追加レイヤーを作成する必要があるように感じます

 var sliderContainer = COOP.namespace('sliderContainer');
 sliderContainer.sliderContainer = function () {
 return slider = ($('#slider').length > 0) ? $('#slider') : $('#element_temp'); 
 }

これはばかげて冗長に思えます-これを行うより良い方法はありますか?

いつものようにどんな情報でも大歓迎です - ページにはjsファイルへの直接リンクがあります

4

1 に答える 1

1

名前空間関数は、COOP 内でサブ名前空間を作成するときに役立ちます。複数のチェックを回避するのに役立ちます。たとえば、COOP.module.module1を作成する場合、モジュールとモジュール 1 が定義されていないかどうかを確認するために 2 つのチェックを行う必要があります。

ただし、この場合、sliderContainer は単なる COOP のプロパティです。名前空間を使用する必要はありません。自分で確認するだけです:

if(COOP.sliderContainer === undefined){
    // define it
}

編集

次の関数ハンドルを使用できます。

COOP.createProperty = function(name, prop){
    if(COOP[name] === undefined){
        COOP[name] = prop;
    }
}

それから

COOP.createProperty("sliderContainer", function(){  
    // do whatever you want
});
于 2013-01-14T04:36:36.587 に答える