在Javascript中使用对象和函数进行命名空间有什么区别?

24 javascript

我在JavaScript中看到了这两种基本的命名空间方式.

  1. 使用对象:

    var Namespace = { };

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

  2. 使用功能:

    function Namespace() { };

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

他们有什么不同?谢谢.

JPo*_*Pot 17

正如其他人所指出的,函数是一个对象,因此这两种形式可以互换.作为旁注,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
Run Code Online (Sandbox Code Playgroud)

这些属性不相交,Object因此object-as-namespace方法不会有这些行为.


cas*_*nca 6

第一个声明一个简单的对象,而第二个声明一个函数.在JavaScript中,函数也是对象,因此除了在第二个示例中可以Namespace()作为函数调用之外,两者之间几乎没有区别.