繁体   English   中英

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

[英]In javascript, what is the difference between an object and a namespace?

在Mozilla网站上阅读“ 面向对象的JavaScript ”时,我偶然发现了这个问题:

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

但是,该说明并未明确“语言级差异”的含义。

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

你已经脱离了背景。 答案在报价上方的段落中

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

(强调我的)

报价单:

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

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

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

例如, Math.roundMath.absMath函数都在Math对象中命名空间。 它们不是真正的上下文方法,比如toString (至少在我发现的任何实现中都没有),只是在一个对象下收集以保持它有条理。 *


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

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

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

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

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

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

那么解决方案是什么?

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

无论如何,像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
};

现在,您有两个具有“相同”名称的功能,这些功能不会妨碍彼此。 如果你想调用Facebook版本的MyFunction你会写这样的代码:

// JavaScript
Facebook.MyFunction();

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

一个额外的说明

很多时候你会看到像这样声明的“namespace”对象:

var MySpace = MySpace || {};

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

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

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

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

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

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

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM