如何创建一个空的命名空间对象而不覆盖另一个同名对象

How can I create an empty namespace object without overwriting another object with the same name?

本文关键字:对象 覆盖 另一个 命名空间 创建 何创建 一个      更新时间:2023-09-26

我一直在尽可能多地研究雅虎YUI博客建议的模块模式。

我注意到YUI提供了创建一个新的空名称空间对象的能力,而无需覆盖现有的同名对象,如下所示:

YAHOO.namespace("myProject");

然后可以调用并与YAHOO.myProject 一起使用

(提醒:如果YAHOO.myProject已经存在,则不会覆盖)

如何在不使用YUI的情况下使用纯javascript实现类似的效果?

请尽可能详细地解释。

YUI的博客文章全文可以在这里找到。

当我在学习和加强我的javascript知识和技能时,我正在尝试创建我自己的个人javascript库(即使我永远不需要使用它)

在您的示例中,它可以这样工作:

if (!YAHOO.myProject) {
    YAHOO.myProject = {};
}
YAHOO.myProject.whatever = true;

或者使用您自己的父模块名称:

var myModule = myModule || {};  // make sure parent is defined without overwriting
if (!myModule.myProject) {
    myModule.myProject = {};
}
myModule.myProject.whatever = true;

或者定义自己的名称空间函数:

function myNamespace(item) {
    if (!myModule[item]) {
        myModule[item] = {};
    }
}
myNamespace("myProject");
myNamespace.myProject.whatever = true;

编辑刚刚意识到我不是直接回答你的问题。很抱歉然而,希望这将帮助你理解一些替代技术。

这是我不时使用的一种技术,例如当我想添加一次属性或函数而不允许以后覆盖它时。

    var module = new function(){
        var modules = {}; //internal module cache
        return function(name, module){
            //return all modules
            if( !name ) return modules;
            //return specific module
            if( modules[name] ) return modules[name];
            //return the module and store it
            return modules[name] = module;
        }
    }

所以你可以这样使用它:

//will store this since it doesn't exist
module('test', 'foo'); //Since 'test' doesn't exist on the internal 'modules' variable, it sets this property with the value of 'foo'
module('test'); // Since we aren't passing a 2nd parameter, it returns the value of 'test' on the internal 'modules' variable
module('test', 'bar'); //We are attempting to change the value of 'test' to 'bar', but since 'test' already equals 'foo', it returns 'foo' instead.
module(); // { 'test': 'foo' } //Here we aren't passing any parameters, so it just returns the entire internal 'modules' variable. 

需要注意的关键是,我们正在使用"new function()"。这是在赋值时完成的,因为我们真的希望"module"是内部函数,而不是外部函数。但是,为了为内部"var modules"变量创建闭包,外部函数必须在赋值时执行。

还要注意,您也可以将外部函数编写为自执行函数:

var module = function(){
    var modules = {};
    //other stuff
}();

Q。如何创建一个空的命名空间对象而不覆盖另一个同名对象

你不能。根据定义,相同的名称不能同时引用新的空对象和现有对象。

如果你的意思是"只有在空名称空间对象不存在的情况下,我才能检查创建它,否则我想添加到现有的名称空间对象中",那么你只需要这样做:

if (!YAHOO.myProject)
   YAHOO.myProject = {};
// or you may see this variation:
YAHOO.myProject = YAHOO.myProject || {};

我不喜欢后者,但它经常被用来实现与普通if语句相同的效果。

要进一步了解这一一般原则,请查看本文:http://www.adequatelygood.com/2010/3/JavaScript-Module-Pattern-In-Depth

更新:根据用于YAHOO.namespace()的YUI API文档,方法"返回指定的名称空间,并在不存在的情况下创建它"-你会注意到,这比你正在阅读的博客的措辞要模糊得多,并且基本上支持了我已经说过的话。。。