كيفية توفير مساحات الأسماء في JavaScript مع الكائنات الموجودة

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

  •  09-06-2019
  •  | 
  •  

سؤال

لدي "كائن" جافا سكريبت، تم إنشاؤه بهذه الطريقة:

function foo()
{
    this.length = 0;
}

foo.prototype.getLength = function()
{
    return this.length;
}

...

أعرف كيفية محاكاة مساحات الأسماء باستخدام كائنات JavaScript المفردة، ولكن ما هي أفضل طريقة لـ "مساحة الاسم" لكائن مثل ذلك الموجود أعلاه والذي سيتم حثه؟

أعلم أن العديد من مكتبات JavaScript تتمتع بقدرات تحديد الأسماء، لكنني أستخدم jQuery وأفضّل عدم إضافة مكتبة أخرى إلى هذا المزيج.أود أن أكون قادرًا على توفير نظام خاص بي، ربما عن طريق استغلال jQuery، وهو نظام مسافة الاسم الجوهري لكائنات JS الخاصة بي والتي تحتاج إلى مثيل.

شكرا RP

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

المحلول

بسيط:

if(!MyNamespace) MyNamespace = {};

MyNamespace.foo = function() {
   this.length = 0;
};
MyNamespace.foo.prototype.getLength = function() {
   return this.length;
};

نصائح أخرى

لا تحتوي Javascript على مساحة اسم أو حزم مثل اللغات الأخرى.بدلا من ذلك لديها الإغلاق.إذا كان لديك تطبيق يتكون من وظائف ومتغيرات وكائنات متعددة، فيجب عليك وضعها داخل كائن عام واحد.سيكون لهذا نفس تأثير مساحة الاسم.

على سبيل المثال:

var namespace = {
  this.foo: function(){
    ...
  },
  this.foo.prototype.getLength: function(){
    ...
  }
}

يمكنك أيضًا إنشاء مجموعة من الكائنات المتداخلة ومحاكاة الحزم:

loadPackage = function(){
  var path = arguments[0];
  for(var i=1; i<arguments.length; i++){
    if(!path[arguments[i]]){
      path[arguments[i]] = {};
    }
    path = path[arguments[i]];
  }
  return path;
}

loadPackage(this, "com", "google", "mail") = {
  username: "gundersen",
  login: function(password){
    ...
  }
}
this.com.google.mail.login("mySecretPassword");

لا ينبغي أن يكون مختلفا كثيرا:

namespace.foo = function foo() {...}
namespace.foo.prototype.getLength = function() { ... }

أو يمكنك استخدام

(function() {
  function foo() { ... }
  foo.prototype...
  namespace.foo = foo;
})();

لحفظ بعض الكتابة.

كلتا الإجابتين كانت مفيدة للغاية!وإليكم ما انتهى بي الأمر:

if( typeof( rpNameSpace ) == "undefined" ) rpNameSpace = {};

rpNameSpace.foo = function() {
    this.length = 613;
}
rpNameSpace.foo.prototype.getLength = function() {
    return this.length * 2;
}

بعد ذلك، لاستخدام الكائن "مساحة الاسم" الناتج:

var x = new rpNameSpace.foo()

display( x.getLength() );

بديل آخر قد يكون bob.js نطاق:

bob.ns.setNs('myApp.myFunctions', { 
    say: function(msg) {  
        console.log(msg); 
    } 
}); 

//sub-namespace
bob.ns.setNs('myApp.myFunctions.mySubFunctions', { 
    hello: function(name) { 
        myApp.myFunctions.say('Hello, ' + name); 
    } 
}); 

//call:
myApp.myFunctions.mySubFunctions.hello('Bob'); 
مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top