В чем разница между использованием объектов и функций для пространства имен в Javascript?

Я видел эти два основных способа размещения имен в JavaScript.

  • Использование объекта:

    var Namespace = { };

    Namespace.Class1 = function() { ... };

  • Использование функции:

    function Namespace() { };

    Namespace.Class1 = function() { ... };

Как они отличаются? Спасибо.

Ответ 1

Как указывали другие, функция является объектом, поэтому две формы могут быть взаимозаменяемыми. В качестве примечания стороны jQuery использует подход типа "имя-пространство", чтобы поддерживать вызов и пространство имен (в случае, если вам интересно, кто еще делает что-то или почему).

Однако при использовании подхода типа "имя-пространство" существуют зарезервированные свойства, которые нельзя трогать или в противном случае неизменяемы:

function Namespace(){}

Namespace.name = "foo";  // does nothing, "name" is immutable
Namespace.length = 3;    // does nothing, "length" is immutable
Namespace.caller = "me"; // does nothing, "caller" is immutable

Namespace.call = "1-800-555-5555" // prob not a good idea, because...

// some user of your library tries to invoke the
// standard "call()" method available on functions...
Namespace.call(this, arg); // Boom, TypeError

Эти свойства не пересекаются с Object, поэтому подход типа "объект-как-пространство" не будет иметь такого поведения.

Ответ 2

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

Ответ 3

Ну, если все вы используете нас, используя эту "пространство имен" как способ "содержать" другие имена, то эти два подхода практически одинаковы. Экземпляр функции - это всего лишь объект.

Теперь обычно можно использовать такую ​​функцию, если сама функция должна использоваться как конструктор или как "фокальная точка" для библиотеки (как в случае с jQuery).

Ответ 4

Они этого не делают. Функции: объекты первого класса". Все это означает, что концептуально и внутренне они хранятся и используются одинаково. Точка Касабланки одной разницы, которую вы можете назвать ее функцией, является хорошей. Вы также можете проверить, был ли класс определен с помощью функции с оператором typeof.

typeof {} 

возвращает "объект"

typeof (function())

возвращает "функция"