Javascript, хранящий пространства имен в объеме функций объекта - PullRequest
2 голосов
/ 28 декабря 2011

Мне было интересно, есть ли способ сохранить пространство имен в рамках функций в объекте Javascript.

Прежде всего, давайте настроим некоторые вещи.Предположим, что у нас есть класс (ну, настолько близкий к классу, как это делает Javascript) Foo в пространстве имен FooBar.Затем в глобальном пространстве имен (окне) у нас есть класс Bar, который создает экземпляр Foo, поэтому ...

FooBar.Foo = function() {

}

function Bar() {
  this.init();
}

Bar.prototype = {
  init: function() {
    this.foo = new FooBar.Foo();
  }
}

В настоящее время у меня есть две системы для приведения вещей в область видимости: 1. using ("FooBar") и неиспользованные (" FooBar ") эти функции перемещают ссылки на содержимое заданного пространства имен в и из глобального пространства имен 2. с помощью (namespace (" FooBar ")) {} это использует normal с поведением, давая ему объектсодержащий ссылки на все, что содержится в пространстве имен.Так что сейчас я должен использовать один из этих методов внутри каждой функции, чтобы вывести пространство имен в область видимости.Я пытаюсь увидеть, есть ли метод определения их, когда класс объявлен, и оставить их в области действия только для этого класса из-за какого-то закрытия ...

FooBar.Foo = function() {

}

using("FooBar");

function Bar() {
  this.init();
}

Bar.prototype = {
  init: function() {
    this.foo = new Foo();
  } 
}

unusing("FooBar");

Так что, даВозможно ли что-то подобное, или я застрял в том, чтобы делать это очень часто?

1 Ответ

1 голос
/ 28 декабря 2011

Это ужасно.Я бы предложил использовать современную модульную систему, такую ​​как RequireJS. Мой друг составил хорошую презентацию об эволюции и использовании модульных систем в JavaScript .Это ответ JS на пространства имен.

Ваш код будет выглядеть примерно так:

// FooBar.js
define(function (require, exports, module) {
    exports.Foo = function () { };
});

// Bar.js
define(function (require, exports, module) {
    // This is kind of like "using FooBar" in other languages.
    var Foo = require("FooBar").Foo;

    exports.Bar = function () {
        this.init();
    };
    exports.Bar.prototype = {
        init: function () {
            this.foo = new Foo();
        }
    };
});

// elsewhere.js
define(function (require, exports, module) {
    var Foo = require("FooBar").Foo;
    var Bar = require("Bar").Bar;

    console.log(new Foo());
    console.log(new Bar());
});
...