В чем разница между использованием объектов и функций для пространства имен в 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())
возвращает "функция"