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

时间:2010-11-08 15:56:35

标签: javascript

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

  1. 使用对象:

    var Namespace = { };

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

  2. 使用功能:

    function Namespace() { };

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

  3. 他们有什么不同?谢谢。

4 个答案:

答案 0 :(得分: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

这些属性与Object不相交,因此对象作为命名空间的方法不会有这些行为。

答案 1 :(得分:6)

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

答案 2 :(得分:3)

好吧,如果所有你正在使用“命名空间”作为“包含”其他名称的方式,那么这两种方法几乎完全相同。毕竟,函数实例只是一个对象。

现在,如果函数本身用作构造函数,或者作为库的“焦点”(如jQuery的情况),通常会使用类似的函数。

答案 3 :(得分:3)

他们没有。函数是“first class objects”。所有这些意味着在概念上和内部它们以相同的方式存储和使用。卡萨布兰卡的一个不同之处就是你可以称之为一个功能,但这是一个很好的选择。您还可以通过typeof运算符的函数来测试该类是否已定义。

typeof {} 

返回“对象”

typeof (function())

返回“功能”