阅读" Object-Oriented JavaScript"在Mozilla的网站上,我偶然发现了这个说明:
值得注意的是,在JavaScript中,常规对象和命名空间之间没有语言级差异。
然而,该说明并不清楚"语言级差异"的含义。
这是否意味着有两种方法可以写同一件事? 或者说有两个术语指的是同一个东西?
答案 0 :(得分:14)
您已脱离上下文引用该引用。答案是in the paragraph above the quote:
命名空间是一个容器,它允许开发人员在一个独特的,特定于应用程序的名称下捆绑功能。 在JavaScript中,命名空间只是包含方法,属性和对象的另一个对象 。
(强调我的)
引用:
值得注意的是,在JavaScript中,常规对象和命名空间之间没有语言级差异。
只是说这意味着"命名空间"只是一个用作"命名空间"的对象 没有"真实" JS中的名称空间。
答案 1 :(得分:6)
某些语言的实际命名空间与对象不同。 JavaScript不是这些语言之一,因此对象用于此目的。
例如,Math
和Math.round
等Math.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个具有“相同”名称的功能,这些功能不会妨碍彼此。如果您想调用Facebook
版MyFunction
,您可以编写如下代码:
// JavaScript
Facebook.MyFunction();
正如您在这些示例中看到的那样MySpace
和Facebook
实际上是对象,但它们是我们仅用于分隔函数和变量的对象,这意味着我们只使用它们而不是作为命名空间。
一个额外的注释
很多时候你会看到像这样声明的“名称空间”对象:
var MySpace = MySpace || {};
如果MySpace = MySpace
对象已存在,则表示MySpace
。否则,它会被分配一个新的空对象。这是一种在多个文件中重用MySpace
对象/命名空间的方法。
每个文件都将自己的函数和变量添加到同一个“命名空间”对象中。例如:
var MySpace = MySpace || {};
MySpace.a = 10;
var MySpace = MySpace || {};
MySpace.b = 20;
您最终会得到一个包含变量a
和b
的MySpace对象。即使代码位于不同的文件中,即使您颠倒了顺序,也是如此。
答案 3 :(得分:0)
值得注意的是,在JavaScript中,常规对象和命名空间之间没有语言级差异。
它说“命名空间”不是JavaScript中的实际类型的组件,而只是普通旧JavaScript对象的另一种用法。