Как предоставить пространства имен в JavaScript с созданными экземплярами объектов
-
09-06-2019 - |
Вопрос
У меня есть JavaScript-"объект", построенный таким образом:
function foo()
{
this.length = 0;
}
foo.prototype.getLength = function()
{
return this.length;
}
...
Я знаю, как эмулировать пространства имен с помощью одноэлементных объектов JavaScript, но каков наилучший способ "namepace" объекта, подобного приведенному выше, который будет использоваться?
Я знаю, что несколько библиотек 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');