扩展JavaScript命名空间

扩展JavaScript命名空间,javascript,javascript-namespaces,Javascript,Javascript Namespaces,我是否做错了什么,或者这是不可能的: (function(namespace,undefined) { //Private properties and methods var foo="bar"; function test(){return foo;} //Public properties and methods namespace.foobar=foo+"123"; namespace.showFoo=function(){return

我是否做错了什么,或者这是不可能的:

(function(namespace,undefined)
{
    //Private properties and methods
    var foo="bar";
    function test(){return foo;}

    //Public properties and methods
    namespace.foobar=foo+"123";
    namespace.showFoo=function(){return test();};
})(window.namespace=window.namespace || {});
然后,我尝试“扩展”上述名称空间并添加一个新方法:

(function(namespace,undefined)
{
    //Public method
    namespace.sayGoodbye=function()
    {
        alert(namespace.foo);
        alert(namespace.bar);
        alert(test());
    }
})(window.namespace=window.namespace || {});
此警报显示属性的
undefined
,并为
test()
方法抛出错误


谢谢。

为什么您希望有
foo
bar
可用?这些标识符永远不会分配给
命名空间
对象的任何位置

使用
var
声明的任何变量仅在当前激活/变量对象的函数(-Context)中可用。在您的例子中,
test()
,函数声明也是如此。这两个函数都只存储在第一个匿名函数的AO中,而不存储在
命名空间
对象中。您必须显式地分配这些值

namespace.foo = foo;
namespace.bar = "hello I am bar";

为什么您希望提供
foo
bar
?这些标识符永远不会分配给
命名空间
对象的任何位置

使用
var
声明的任何变量仅在当前激活/变量对象的函数(-Context)中可用。在您的例子中,
test()
,函数声明也是如此。这两个函数都只存储在第一个匿名函数的AO中,而不存储在
命名空间
对象中。您必须显式地分配这些值

namespace.foo = foo;
namespace.bar = "hello I am bar";

您的代码中有几个bug。那代码正在运行

错误: 1.您从未设置变量window.namespace。 2.如果在函数中以私有方式声明变量/函数,则只有此特定函数才能访问这些变量/函数。 如果要使用名称空间,可以这样做:

var namespace = (function(){
        var private = "private";
        function privateFunc() {
                return private;
        }
        return {
            "publicFunc": function(){return privateFunc()}
        }
    })();
namespace.publicFunc() === "private";
//alert(namespace.publicFunc());


// extend namespace
(function(namespace){
    var private = "other private";
    namespace.newFunc = function(){return private};
})(namespace);
namespace.newFunc() === "other private";
//alert(namespace.newFunc());

您的代码中有几个bug。那代码正在运行

错误: 1.您从未设置变量window.namespace。 2.如果在函数中以私有方式声明变量/函数,则只有此特定函数才能访问这些变量/函数。 如果要使用名称空间,可以这样做:

var namespace = (function(){
        var private = "private";
        function privateFunc() {
                return private;
        }
        return {
            "publicFunc": function(){return privateFunc()}
        }
    })();
namespace.publicFunc() === "private";
//alert(namespace.publicFunc());


// extend namespace
(function(namespace){
    var private = "other private";
    namespace.newFunc = function(){return private};
})(namespace);
namespace.newFunc() === "other private";
//alert(namespace.newFunc());

名称空间声明和名称空间扩展:

var namespace = function(str, root) {
    var chunks = str.split('.');
    if(!root)
        root = window;
    var current = root;
    for(var i = 0; i < chunks.length; i++) {
        if (!current.hasOwnProperty(chunks[i]))
            current[chunks[i]] = {};
        current = current[chunks[i]];
    }
    return current;
};

// ----- USAGE ------

namespace('ivar.util.array');

ivar.util.array.foo = 'bar';
alert(ivar.util.array.foo);

namespace('string', ivar.util); //or namespace('ivar.util.string');

ivar.util.string.foo = 'baz';
alert(ivar.util.string.foo); 
var namespace=function(str,root){
var chunks=str.split('.');
如果(!root)
根=窗口;
无功电流=根;
for(var i=0;i
试一试:


博客帖子:

名称空间声明和名称空间扩展:

var namespace = function(str, root) {
    var chunks = str.split('.');
    if(!root)
        root = window;
    var current = root;
    for(var i = 0; i < chunks.length; i++) {
        if (!current.hasOwnProperty(chunks[i]))
            current[chunks[i]] = {};
        current = current[chunks[i]];
    }
    return current;
};

// ----- USAGE ------

namespace('ivar.util.array');

ivar.util.array.foo = 'bar';
alert(ivar.util.array.foo);

namespace('string', ivar.util); //or namespace('ivar.util.string');

ivar.util.string.foo = 'baz';
alert(ivar.util.string.foo); 
var namespace=function(str,root){
var chunks=str.split('.');
如果(!root)
根=窗口;
无功电流=根;
for(var i=0;i
试一试:


博客帖子:

好的,我想太糟糕了。谢谢。好的,我也在想哦。谢谢。关于您识别为“bug 1”的内容,问题中的代码确实设置了window.namespace,在传递给每个匿名对象的参数中,如果它已经存在,则将其分配给自己,否则分配给空对象。例如,它会根据需要进行扩展或创建。关于您识别为“bug 1”的内容,问题中的代码会在传递给每个匿名对象的参数中设置window.namespace,如果该参数已经存在,则会将其分配给自身,否则会分配给空对象。也就是说,它可以根据需要进行扩展或创建。