如何在多个文件中分割JavaScript类,并使它们属于同一名称空间?

如何在多个文件中分割JavaScript类,并使它们属于同一名称空间?,javascript,Javascript,我了解到,您可以通过在函数表达式或对象文本中限定类/对象的范围来模拟JavaScript中的名称空间。这样,包含的对象或函数就为包含的对象提供了名称空间和作用域 但要让它们工作,所有包含的对象必须在同一个文件中,对吗 因为如果在两个不同的文件中有两个名称相同的名称空间/命名容器对象,它们将根据包含源文件的顺序相互覆盖 File1.js var Automtomobiles = { function Wheel() { ... } }; var Automtomobiles = {

我了解到,您可以通过在函数表达式或对象文本中限定类/对象的范围来模拟JavaScript中的名称空间。这样,包含的对象或函数就为包含的对象提供了名称空间和作用域

但要让它们工作,所有包含的对象必须在同一个文件中,对吗

因为如果在两个不同的文件中有两个名称相同的名称空间/命名容器对象,它们将根据包含源文件的顺序相互覆盖

File1.js

var Automtomobiles = 
{
  function Wheel() { ... }
};
var Automtomobiles = 
{
  function Car() { ... }
};
File2.js

var Automtomobiles = 
{
  function Wheel() { ... }
};
var Automtomobiles = 
{
  function Car() { ... }
};

如何跨多个文件跨对象/类定义,但将它们保留在同一命名空间中?

将Automtomobiles作为全局对象

File1.js

var Automtomobiles = Automtomobiles || {};
Automtomobiles.wheel = function() {
}
File2.js

var Automtomobiles = Automtomobiles || {};
Automtomobiles.car = function() {
}

将Automtomobiles设置为全局对象

File1.js

var Automtomobiles = Automtomobiles || {};
Automtomobiles.wheel = function() {
}
File2.js

var Automtomobiles = Automtomobiles || {};
Automtomobiles.car = function() {
}

要使它们成为全局的,可以使用
window.Automtobiles=function()
或为
类型定义静态属性。您可以使用
.prototype

职能人员(第一、最后、年龄、眼睛颜色){
this.firstName=first;
this.lastName=last;
这个。年龄=年龄;
this.eyeColor=eyeColor;
}
Person.prototype.national=“英语”;

日志(新人物(“约翰”、“史密斯”、20、“红色”))要使它们成为全局的,您可以使用
window.Automtobiles=function()
或为
类型定义静态属性。您可以使用
.prototype

职能人员(第一、最后、年龄、眼睛颜色){
this.firstName=first;
this.lastName=last;
这个。年龄=年龄;
this.eyeColor=eyeColor;
}
Person.prototype.national=“英语”;

日志(新人物(“约翰”、“史密斯”、20、“红色”))使用纯javascript,您可以使用许多库使用的通用符号。对于一个文件:

var Automtomobiles;
(function (Automtomobiles) {
    var Wheel = (function () {
        function Wheel() {};        
        return Wheel;
    }());
    Automtomobiles.Wheel = Wheel;
})(Automtomobiles || (Automtomobiles = {}));
另一个文件:

var Automtomobiles;
(function (Automtomobiles) {
    var Car= (function () {
        function Car() {};      
        return Car;
    }());
    Automtomobiles.Car= Car;
})(Automtomobiles || (Automtomobiles = {}));
无论如何,如果您愿意使用第三方库,它们也可以帮助您。很久以前,我使用了这个特性,它为您管理名称空间和类名,尽管我确信目前存在更多的库来实现这一点


事实上,你也可以使用
Typescript
,这是实现你的目标和学习的最佳选择。由
Typescript
生成的代码与我上面发布的示例类似。

使用纯javascript,您可以使用许多库使用的通用符号。对于一个文件:

var Automtomobiles;
(function (Automtomobiles) {
    var Wheel = (function () {
        function Wheel() {};        
        return Wheel;
    }());
    Automtomobiles.Wheel = Wheel;
})(Automtomobiles || (Automtomobiles = {}));
另一个文件:

var Automtomobiles;
(function (Automtomobiles) {
    var Car= (function () {
        function Car() {};      
        return Car;
    }());
    Automtomobiles.Car= Car;
})(Automtomobiles || (Automtomobiles = {}));
无论如何,如果您愿意使用第三方库,它们也可以帮助您。很久以前,我使用了这个特性,它为您管理名称空间和类名,尽管我确信目前存在更多的库来实现这一点


事实上,你也可以使用
Typescript
,这是实现你的目标和学习的最佳选择。通过
Typescript
生成的代码与我上面发布的示例类似。

通过使namespace globalI了解原型继承。我的问题是关于在同一上下文/名称空间/命名容器下跨多个源文件拆分对象。只要它们位于同一
文档
(网页)中,它们都将位于全局名称空间或您指定的任何名称空间内。是的,基本上与@Kenny的建议相同。干得好。因此,我推断,除了通过添加到现有类的原型或现有对象使代码变得有点复杂之外,没有其他方法。谢谢,我知道原型遗传。我的问题是关于在同一上下文/名称空间/命名容器下跨多个源文件拆分对象。只要它们位于同一
文档
(网页)中,它们都将位于全局名称空间或您指定的任何名称空间内。是的,基本上与@Kenny的建议相同。干得好。因此,我推断,除了通过添加到现有类的原型或现有对象使代码变得有点复杂之外,没有其他方法。谢谢,谢谢。那是什么?
?它是否从所有其他文件中附加
名称空间/对象的所有其他声明,并将它们合并到一个声明中?我使用了| |运算符,因为无论您以何种顺序加载文件,所有这些都应该工作。因此,如果先加载文件2,则汽车将{}。汽车财产将附属于它。当文件1加载时,汽车将成为具有汽车属性的对象。如果知道要加载的第一个文件,只需声明var={};仅在该文件中。那么你就不需要使用| |operator@Water在v2中,
|
是OR运算符。该语句基本上执行以下操作:var Automtobiles等于它以前的值,或者如果它以前没有定义过,那么它等于由
{}标识的空对象
任何时候,只要将逻辑操作放在定义的右侧,如
var something=(逻辑操作)
则执行该操作,并使用结果确定下一个操作(在本例中,逻辑运算是| |,任何对象都可以通过简单地测试一个定义是否为非零的第三或第四topicThank来测试是否存在。那是什么
|
,我在哪里可以读到它?它是否附加了所有其他文件和merg中的
名称空间/对象的所有其他声明我使用了| |运算符,因为无论您以何种顺序加载文件,所有文件都应该工作。因此,如果先加载文件2,则汽车将{}.和car属性将附加到它。当file1加载时,汽车将是一个具有car属性的对象。如果您知道要加载的第一个文件,您只需在该文件中声明var Automobiles={};即可。然后您不需要使用| |operator@Wate