在javascript中,对象和命名空间之间有什么区别?

时间:2016-07-14 06:22:30

标签: javascript

阅读" Object-Oriented JavaScript"在Mozilla的网站上,我偶然发现了这个说明:

  

值得注意的是,在JavaScript中,常规对象和命名空间之间没有语言级差异

然而,该说明并不清楚"语言级差异"的含义。

这是否意味着有两种方法可以写同一件事? 或者说有两个术语指的是同一个东西?

4 个答案:

答案 0 :(得分:14)

您已脱离上下文引用该引用。答案是in the paragraph above the quote

  

命名空间是一个容器,它允许开发人员在一个独特的,特定于应用程序的名称下捆绑功能。 在JavaScript中,命名空间只是包含方法,属性和对象的另一个对象

(强调我的)

引用:

  

值得注意的是,在JavaScript中,常规对象和命名空间之间没有语言级差异

只是说这意味着"命名空间"只是一个用作"命名空间"的对象 没有"真实" JS中的名称空间。

答案 1 :(得分:6)

某些语言的实际命名空间与对象不同。 JavaScript不是这些语言之一,因此对象用于此目的。

例如,MathMath.roundMath.abs函数都在Math对象中命名空间。它们不像toString这样的上下文方法(至少在我发现的任何实现中都没有),只是在一个对象下收集以保持组织。 *

*它们是技术上的方法,因为它们可以被对象上的属性访问(这个定义在技术上使所有全局函数方法,因为它们可以通过全局使用object(即window.Function())),但与toString之类的方法或大多数console实现的方法(如console.log不同)它们不依赖于它们被调用的对象并且this值无关紧要。 Math对象仅用于命名空间,而不是因为它提供的上下文。

答案 2 :(得分:2)

首先,您确定知道名称空间是什么吗?真实快速:

让我们用一个类比。在您的计算机上,您有文件。但是你不只是拥有文件夹的文件。为什么?

因为如果没有文件夹,每个文件名都必须是唯一的,并且很难保持整洁。

如果您只有全局变量,则变量名称相同。如果你只能拥有全局变量,那么每个变量名都必须是完全唯一的。

这很难跟踪。您可能会偶然使用相同的变量名称。你的代码会很有趣,很难追查问题。

那么解决方案是什么?

这是正确的把你的变量放到文件夹中,嗯,对不起,我的意思是命名空间,把它们放入命名空间。我必须弄清楚如何使用退格键。

无论如何,像C#和Java这样的语言可以让你做到这一点:

// C# - example of a language with built in support for namespaces

namespace MySpace {
    class MyClass {
    }
}

namespace Facebook {
    class MyClass {
    }
}

没有冲突,因为这些类位于不同的命名空间中。然后在你的代码中,如果你想实例化它们,你会写这样的东西:

// C# again (JavaScript code coming up soon - keep scrolling)
var myObject = new Facebook.MyClass();

这很棒,但JavaScript没有namespace个关键字。从技术上讲,它没有名称空间,它拥有的是一些非常聪明的程序员。

他们的解决方案?使用对象。

// JavaScript
var MySpace = {};
MySpace.MyFunction = function() {
    // insert brilliant code here
};

var Facebook = {};
Facebook.MyFunction = function() {
    // insert more brilliant code here
};

现在你有2个具有“相同”名称的功能,这些功能不会妨碍彼此。如果您想调用FacebookMyFunction,您可以编写如下代码:

// JavaScript
Facebook.MyFunction();

正如您在这些示例中看到的那样MySpaceFacebook实际上是对象,但它们是我们仅用于分隔函数和变量的对象,这意味着我们只使用它们而不是作为命名空间。

一个额外的注释

很多时候你会看到像这样声明的“名称空间”对象:

var MySpace = MySpace || {};

如果MySpace = MySpace对象已存在,则表示MySpace。否则,它会被分配一个新的空对象。这是一种在多个文件中重用MySpace对象/命名空间的方法。

每个文件都将自己的函数和变量添加到同一个“命名空间”对象中。例如:

var MySpace = MySpace || {};
MySpace.a = 10;

var MySpace = MySpace || {};
MySpace.b = 20;

您最终会得到一个包含变量ab的MySpace对象。即使代码位于不同的文件中,即使您颠倒了顺序,也是如此。

答案 3 :(得分:0)

  

值得注意的是,在JavaScript中,常规对象和命名空间之间没有语言级差异。

它说“命名空间”不是JavaScript中的实际类型的组件,而只是普通旧JavaScript对象的另一种用法。