Как обеспечить пространства имен в JavaScript с инстанцированными объектами

Чтобы перезаписать метод, означает, что всякий раз, когда метод вызывается на объекте производного класса, вызывается новая реализация.

Чтобы скрыть метод, означает, что неквалифицированный вызов этого имени в область действия этого класса (т. е. в теле любого из его методов или при наличии имени этого класса) теперь вызовет совершенно другую функцию, , требующую квалификации для доступа к статическому методу с тем же именем из родительский класс .

Подробнее Наследование Java: перезаписанные или скрытые методы

10
задан Community 9 September 2008 в 23:13
поделиться

4 ответа

Простой:

if(!MyNamespace) MyNamespace = {};

MyNamespace.foo = function() {
   this.length = 0;
};
MyNamespace.foo.prototype.getLength = function() {
   return this.length;
};
12
ответ дан 3 December 2019 в 18:03
поделиться

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");
7
ответ дан 3 December 2019 в 18:03
поделиться

Не должно очень отличаться:

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

или Вы могли использовать

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

сохранить некоторый ввод.

2
ответ дан 3 December 2019 в 18:03
поделиться

Оба ответа были очень полезны! Вот то, с чем я закончил:

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

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

Затем для использования получающегося объекта "namespaced":

var x = new rpNameSpace.foo()

display( x.getLength() );
2
ответ дан 3 December 2019 в 18:03
поделиться
Другие вопросы по тегам:

Похожие вопросы: