协慌网

登录 贡献 社区

如何在 JavaScript 中声明命名空间?

如何在 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参数是值undefined的变量的来源。我不确定它今天是否仍然有用,但是在使用旧的浏览器 / JavaScript 标准(ecmascript 5,javascript <1.8.5~firefox 4)时,全局范围变量undefined是可写的,所以任何人都可以重写它的值。第三个参数(未传递值时)创建一个名为undefined的变量,该变量的作用域为命名空间 / 函数。由于在创建名称空间时未传递任何值,因此默认值为undefined

我喜欢这个:

var yourNamespace = {

    foo: function() {
    },

    bar: function() {
    }
};

...

yourNamespace.foo();

另一种方法,我认为它比对象文字形式稍微限制一点,是这样的:

var ns = new function() {

    var internalFunction = function() {

    };

    this.publicFunction = function() {

    };
};

上面的内容非常类似于模块模式无论您喜欢与否 ,它都允许您将所有功能公开,同时避免使用对象文字的严格结构。