[英]What is the difference between a JS object using literal notation and a namespace
[英]In javascript, what is the difference between an object and a namespace?
在Mozilla网站上阅读“ 面向对象的JavaScript ”时,我偶然发现了这个问题:
值得注意的是,在JavaScript中,常规对象和命名空间之间没有语言级差异 。
但是,该说明并未明确“语言级差异”的含义。
这是否意味着有两种方法可以写同样的东西? 或者说有两个术语指的是同一个东西?
你已经脱离了背景。 答案在报价上方的段落中 :
命名空间是一个容器,允许开发人员在一个独特的,特定于应用程序的名称下捆绑功能。 在JavaScript中,命名空间只是包含方法,属性和对象的另一个对象 。
(强调我的)
报价单:
值得注意的是,在JavaScript中,常规对象和命名空间之间没有语言级差异 。
只是说这意味着“命名空间”只是一个用作“命名空间”的对象。
JS中没有“真正的”命名空间。
有些语言的实际名称空间与对象不同。 JavaScript不是这些语言之一,因此对象用于此目的。
例如, Math.round
和Math.abs
等Math
函数都在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();
正如您在这些示例中看到的那样, MySpace
和Facebook
实际上是对象,但它们是我们仅用于分离函数和变量的对象,这意味着我们只使用它们作为命名空间。
一个额外的说明
很多时候你会看到像这样声明的“namespace”对象:
var MySpace = MySpace || {};
这意味着如果MySpace
对象已经存在, MySpace = MySpace
。 否则,它会被分配一个新的空对象。 这是在多个文件中重用MySpace
对象/命名空间的一种方法。
每个文件都将自己的函数和变量添加到同一个“命名空间”对象中。 例如:
var MySpace = MySpace || {};
MySpace.a = 10;
var MySpace = MySpace || {};
MySpace.b = 20;
最终得到一个带有变量a
和b
MySpace对象。 即使代码位于不同的文件中,即使您颠倒了顺序,也是如此。
值得注意的是,在JavaScript中,常规对象和命名空间之间没有语言级差异。
它说“命名空间”不是JavaScript中的实际类型的组件,而只是普通旧JavaScript对象的另一种用法。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.