我想在MyNamespace中命名一些函数。我想首先我会创建一个对象MyNamespace
,然后在其中定义函数。
如何在仍然使用function myThing() {...}
形式的同时将命令分配给命名空间?这种语法是什么样的?
不起作用的对象语法:
var MyNamespace = {
function helloWorld() {
console.log('hi!');
}
function goodbyeWorld() {
console.log('I <3 Titanic');
}
}
MyNamespace.helloWorld();
将起作用的对象语法,但不使用function(){}语法
var MyNamespace = {
helloWorld: function() {
console.log('hi!');
},
goodbyeWorld: function() {
console.log('I <3 Titanic');
}
}
MyNamespace.helloWorld();
也许我可以做function MyNamespace.helloWorld() {...}
但这似乎不起作用。
答案 0 :(得分:4)
你的第二个例子是最常用的方式。按顺序使用“function name()”没有技术优势。还有另一种选择:
function wrapper() {
function helloWorld() {
}
function privateFunction() { }
return {
helloWorld: helloWorld
};
}
在该实例中,您还可以声明名称空间私有函数,就像那里那样。 helloWorld可以调用privateFunction,但外面没有任何东西可以直接调用它。 (请注意,所有公共函数都需要在返回的对象中)
自动实例化:
// in the ... insert my above example
window.mynamespace = (...)();
答案 1 :(得分:2)
您可以像在此处一样在原始对象中声明它们:
var MyNamespace = {
helloWorld: function() {
console.log('hi!');
},
goodbyeWorld: function() {
console.log('I <3 Titanic');
}
}
MyNamespace.helloWorld();
MyNamespace.goodbyeWorld();
或者,您可以声明命名空间,然后像这样添加方法:
// declare namespace object
var MyNamespace = {};
// add methods to the namespace
MyNamespace.helloWorld = function() {
console.log('hi!');
};
MyNamespace.goodbyeWorld = function() {
console.log('I <3 Titanic');
};
MyNamespace.helloWorld();
MyNamespace.goodbyeWorld();
这使您可以在不同的地方甚至在不同的源文件中向命名空间添加方法。
并且,如果你想拥有一些私有但静态的变量,你可以使用IIFE(立即调用的函数表达式)来封装这些变量:
var MyNamespace = (function() {
var privateCntr = 0;
return {
getUniqueCnt: function() {
return ++privateCntr;
},
goodbyeWorld: function() {
console.log('I <3 Titanic');
}
};
})();
var uniqueID = MyNamespace.getUniqueCnt();
MyNamespace.goodbyeWorld();
所有三个选项都实现了相同的目标。第三个选项为您提供了私有变量的选项(其他两个没有),您也可以使用第二种方法在以任何其他方式声明命名空间后添加更多方法(尽管您在IIFE之外添加的方法赢得了& #39; t可以访问私有变量。)
如果我需要任何私有变量,我使用第三个选项。
如果我不需要私有变量,并且我要在一个地方定义所有方法,我更喜欢第一个选项,因为它似乎更明显是什么?做 - 你用一堆方法声明一个对象,所有方法都在一个地方声明。
如果我在多个文件中添加方法并且不需要任何私有变量,我将使用第二个选项。