2010-11-08 23 views
23

Vi estas 2 formas básicas de espacios de nombres en JavaScript.¿Cuál es la diferencia entre usar objetos y funciones para el espaciado de nombres en Javascript?

  1. Uso de objeto:

    var Namespace = { };

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

  2. función usando:

    function Namespace() { };

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

en qué se diferencian? Gracias.

+2

[Libro de patrones de diseño de JS] (http://addyosmani.com/resources/essentialjsdesignpatterns/book/#detailnamespacing) contiene un capítulo sobre diferentes patrones de espacios de nombres. – hellectronic

Respuesta

16

Como otros han señalado, una función es un objeto de modo que las dos formas pueden ser intercambiables. Como nota al margen, jQuery utiliza el enfoque de función como espacio de nombres para admitir la invocación de espacios de nombres y (en caso de que se pregunte quién más hace ese tipo de cosas o por qué).

Sin embargo, con el enfoque de la función-como-espacio de nombres, no están reservados propiedades que no deben tocarse o de otra manera son inmutables:

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 

Estas propiedades no se cruzan con Object lo que el enfoque de objetos-como-espacio de nombres no tendrá estos comportamientos.

6

El primero declara un objeto simple mientras que el segundo declara una función. En JavaScript, las funciones también son objetos, por lo que casi no hay diferencia entre los dos, excepto que en el segundo ejemplo puede llamar al Namespace() como una función.

3

Bueno, si todos nos está utilizando usando ese espacio de "Namespace" como una manera de "contener" otros nombres, entonces esos dos enfoques son prácticamente iguales. Una instancia de función es solo un objeto, después de todo.

Ahora, en general, uno usaría una función como esa si la función en sí fuera a usarse como un constructor, o como un "punto focal" para una biblioteca (como es el caso de jQuery).

3

No lo hacen. Las funciones son "first class objects". Todo esto significa que conceptualmente e internamente se almacenan y usan de la misma manera. Sin embargo, el punto de diferencia de Casablanca puede llamarlo como una función. También puede probar si la clase se definió o no a través de una función con el operador typeof.

typeof {} 

retornos "objeto"

typeof (function()) 

devuelve "función"

Cuestiones relacionadas