هل هناك "موجزة" طريقة للقيام namespacing في جافا سكريبت ؟

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

  •  08-06-2019
  •  | 
  •  

سؤال

لقد واجه كثير من الأحيان المواقع التي تضع كل من جافا سكريبت داخل namespace الهيكل على غرار:

namespaces = { com : { example: { example.com's data} }

غير أن هذا الإعداد بأمان فيما يتعلق الأخرى namespaced الأطر يبدو أن تتطلب نسبيا كمية كبيرة من التعليمات البرمجية (تعريفها > خطوط 2).كنت أتساءل ما إذا كان أي شخص يعرف طريقة موجزة أن تفعل هذا ؟ وعلاوة على ذلك, إذا كان هناك قياسي نسبيا/متسقة الطريق إلى الهيكل ؟ على سبيل المثال ، com مساحة يعلق مباشرة على الكائن العالمي ، أو هو المرفقة من خلال مساحة الكائن ؟

[تحرير:يصيح ، ومن الواضح {com = { ... } } لن تنجز أي شيء قريب إلى ما نويت بفضل Shog9 لافتا إلى أن.]

هل كانت مفيدة؟

المحلول

جافا سكريبت لا يجب الأسماء مستقلة.وقد الوظائف التي يمكن أن توفر نطاق لحل الأسماء والأشياء التي يمكن أن تسهم في اسمه البيانات يمكن الوصول إليها في نطاق.

وهنا سبيل المثال ، تصحيح:

var namespaces = { com: { example: { /* example.com's data */ } } }

هذا هو متغير namespaces يتم تعيين كائن الحرفي.الكائن يحتوي على خاصية واحدة: com, كائن مع خاصية واحدة: example, كائن والتي يفترض أن تحتوي على شيء مثير للاهتمام.

لذا يمكنك كتابة شيء مثل مساحات الأسماء.com.على سبيل المثال.somePropertyOrFunctionOnExample و أنه سوف يعمل.بالطبع, كما أنها سخيفة.لا الهرمية مساحة, لديك كائن يحتوي على كائن يحتوي على كائن مع الاشياء يهمك فعلا.

var com_example_data = { /* example.com's data */ };

التي تعمل فقط كذلك ، دون طائل الهرمي.

الآن, إذا كنت فعلا تريد لبناء هرم, يمكنك أن تجرب شيئا من هذا القبيل:

com_example = com_example || {};
com_example.flags = com_example.flags || { active: false, restricted: true};

com_example.ops = com_example.ops || (function()
    {
       var launchCodes = "38925491753824"; // hidden / private
       return {
         activate: function() { /* ... */ },
         destroyTheWorld: function() { /* ... */ }
       };
    })();

و هو IMHO, معقول موجزة.

نصائح أخرى

هنا كان مادة مثيرة للاهتمام من قبل بيتر Michaux على جافا سكريبت Namespacing.وهو يناقش 3 أنواع مختلفة من جافا سكريبت namespacing:

  1. بادئة Namespacing
  2. كائن واحد Namespacing
  3. متداخلة كائن Namespacing

لن تسرق ما قاله هنا ولكن أعتقد أن المادة هي مفيدة للغاية.

بيتر بل ذهب أبعد من ذلك أن نشير إلى أن هناك اعتبارات الأداء مع بعض منهم.أعتقد أن هذا الموضوع سيكون من المثير للاهتمام أن نتحدث عن معتبرا أن الجديد ECMAScript الانسجام خطط انخفضت 4.0 خطط namespacing والتغليف.

وأنا أحاول أن اتبع ياهو الاتفاقية من صنع الوالدين الكائن في نطاق عالمي تحتوي على كل شيء ؛

var FP = {};
FP.module = {};
FP.module.property = 'foo';

للتأكد من أنك لا الكتابة فوق كائن موجود, عليك شيء من هذا القبيل:

if(!window.NameSpace) {
    NameSpace = {};
}

أو

var NameSpace = window.NameSpace || {};

بهذه الطريقة يمكنك وضع هذا في الجزء العلوي من كل ملف في التطبيق الخاص بك/موقع الويب الخاص بك دون الحاجة إلى القلق حول الكتابة فوق مساحة الكائن.أيضا تمكنك من كتابة وحدة الاختبارات لكل ملف على حدة.

على YUI المكتبة مكتبة التعليمات البرمجية التي يعالج namespacing باستخدام وظيفة التي قد تجد الأفضل.المكتبات الأخرى قد تفعل هذا أيضا.

كبديل نقطة أو تسطير, هل يمكن استخدام علامة الدولار الشخصية:

var namespaces$com$example = "data"; 

أنا أيضا مثل هذه (المصدر):

(function() {
    var a = 'Invisible outside of anonymous function';
    function invisibleOutside() {
    }

    function visibleOutside() {
    }
    window.visibleOutside = visibleOutside;

    var html = '--INSIDE Anonymous--';
    html += '<br/> typeof invisibleOutside: ' + typeof invisibleOutside;
    html += '<br/> typeof visibleOutside: ' + typeof visibleOutside;
    contentDiv.innerHTML = html + '<br/><br/>';
})();

var html = '--OUTSIDE Anonymous--';
html += '<br/> typeof invisibleOutside: ' + typeof invisibleOutside;
html += '<br/> typeof visibleOutside: ' + typeof visibleOutside;
contentDiv.innerHTML += html + '<br/>';​

استخدام كائن الحرفي إما this كائن أو الصريحة اسم namespacing على أساس الأخوة خصائص المتغير المحلي الذي يحتوي على وظيفة.على سبيل المثال:

var foo = { bar: function(){return this.name; }, name: "rodimus" }
var baz = { bar: function(){return this.name; }, name: "optimus" }

console.log(foo.bar());
console.log(baz.bar());

أو دون صريحة name مكان الإقامة:

var foo = { bar: function rodimus(){return this; } }
var baz = { bar: function optimus(){return this; } }

console.log(foo.bar.name);
console.log(baz.bar.name);

أو دون استخدام this:

var foo = { bar: function rodimus(){return rodimus; } }
var baz = { bar: function optimus(){return optimus; } }

console.log(foo.bar.name);
console.log(baz.bar.name);

استخدام RegExp أو Object منشئ وظائف لإضافة خصائص اسم لمواجهة المتغيرات وغيرها من الأسماء الشائعة ، ثم استخدام hasOwnProperty اختبار للقيام التحقق:

 var foo = RegExp(/bar/);
 
/* Add property */
foo.name = "alpha";

document.body.innerHTML = String("<pre>" + ["name", "value", "namespace"] + "</pre>").replace(/,/g, "&#09;");

/* Check type */
if (foo.hasOwnProperty("name")) 
  {
  document.body.innerHTML += String("<pre>" + ["foo", String(foo.exec(foo)), foo.name] + "</pre>").replace(/,/g, "&#09;");
  }

/* Fallback to atomic value */
else 
  {
  foo = "baz";
  }

var counter = Object(1);

/* Add property */
counter.name = "beta";

if (counter.hasOwnProperty("name")) 
  {
  document.body.innerHTML += String("<pre>" + ["counter", Number(counter), counter.name] + "</pre>").replace(/,/g, "&#09;");
  } 
else 
  {
  /* Fallback to atomic value */
  counter = 0;
  }

دوم يستخدم الاتفاقية التالية إلى مساحة HTML و SVG عنصر واجهة التعاريف:

  • HTMLTitleElement
  • SVGTitleElement
  • SVGScriptElement
  • HTMLScriptElement

جافا سكريبت الأساسية يستخدم النماذج الأولية أن مساحة من toString طريقة بسيطة شكل من الأشكال.

المراجع

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top