如何在 JavaScript 中创建命名空间,以便我的对象和函数不会被其他同名对象和函数覆盖?我使用了以下内容:
if (Foo == null || typeof(Foo) != "object") { var Foo = new Object();}
有没有更优雅或更简洁的方法来做到这一点?
如何在 JavaScript 中创建命名空间,以便我的对象和函数不会被其他同名对象和函数覆盖?我使用了以下内容:
if (Foo == null || typeof(Foo) != "object") { var Foo = new Object();}
有没有更优雅或更简洁的方法来做到这一点?
我使用在 Enterprise jQuery 站点上找到的方法:
这是他们的示例,展示了如何声明私有和公共属性和函数。一切都是作为自动执行的匿名函数完成的。
(function( skillet, $, undefined ) {
//Private Property
var isHot = true;
//Public Property
skillet.ingredient = "Bacon Strips";
//Public Method
skillet.fry = function() {
var oliveOil;
addItem( "\t\n Butter \n\t" );
addItem( oliveOil );
console.log( "Frying " + skillet.ingredient );
};
//Private Method
function addItem( item ) {
if ( item !== undefined ) {
console.log( "Adding " + $.trim(item) );
}
}
}( window.skillet = window.skillet || {}, jQuery ));
因此,如果您想访问公共成员之一,您只需转到skillet.fry()
或skillet.ingredients
。
真正酷的是您现在可以使用完全相同的语法扩展命名空间。
//Adding new Functionality to the skillet
(function( skillet, $, undefined ) {
//Private Property
var amountOfGrease = "1 Cup";
//Public Method
skillet.toString = function() {
console.log( skillet.quantity + " " +
skillet.ingredient + " & " +
amountOfGrease + " of Grease" );
console.log( isHot ? "Hot" : "Cold" );
};
}( window.skillet = window.skillet || {}, jQuery ));
undefined
论点第三,
undefined
argument 是 value 变量的来源undefined
。我不确定它今天是否仍然相关,但是在使用旧浏览器/JavaScript 标准(ecmascript 5,javascript < 1.8.5 ~ firefox 4)时,全局范围变量undefined
是可写的,因此任何人都可以重写其值。第三个参数(当未传递值时)创建一个名为的变量undefined
,其作用域为命名空间/函数。因为在创建命名空间时没有传递任何值,所以它默认为值undefined
。
我喜欢这个:
var yourNamespace = {
foo: function() {
},
bar: function() {
}
};
...
yourNamespace.foo();
有没有更优雅或更简洁的方法来做到这一点?
是的。例如:
var your_namespace = your_namespace || {};
那么你可以拥有
var your_namespace = your_namespace || {};
your_namespace.Foo = {toAlert:'test'};
your_namespace.Bar = function(arg)
{
alert(arg);
};
with(your_namespace)
{
Bar(Foo.toAlert);
}
我通常在闭包中构建它:
var MYNS = MYNS || {};
MYNS.subns = (function() {
function privateMethod() {
// Do private stuff, or build internal.
return "Message";
}
return {
someProperty: 'prop value',
publicMethod: function() {
return privateMethod() + " stuff";
}
};
})();
自从写这篇文章以来,多年来我的风格发生了微妙的变化,现在我发现自己写了这样的闭包:
var MYNS = MYNS || {};
MYNS.subns = (function() {
var internalState = "Message";
var privateMethod = function() {
// Do private stuff, or build internal.
return internalState;
};
var publicMethod = function() {
return privateMethod() + " stuff";
};
return {
someProperty: 'prop value',
publicMethod: publicMethod
};
})();
通过这种方式,我发现公共 API 和实现更容易理解。将 return 语句视为实现的公共接口。