如何创建一个空的命名空间对象而不覆盖另一个同名对象
How can I create an empty namespace object without overwriting another object with the same name?
我一直在尽可能多地研究雅虎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文档,方法"返回指定的名称空间,并在不存在的情况下创建它"-你会注意到,这比你正在阅读的博客的措辞要模糊得多,并且基本上支持了我已经说过的话。。。
- 如何在循环中使用jQuery.on()方法,而不覆盖我循环的对象
- 如何使用自定义功能覆盖时间轴对象.js时间轴对象的_repaintMinorText
- 如何覆盖 javascript 对象数组中的元素
- 合并两个对象而不覆盖
- 覆盖外部对象's函数在Internet Explorer中使用JavaScript
- IE中对象上的Div覆盖
- 使用原型时,JavaScript对象会被覆盖
- (Javascript)覆盖对象内置或继承的属性
- 覆盖对象's的长度属性
- JavaScript两个对象-互相覆盖
- 在javascript中,如何将相同的对象两次推送到一个数组中,并进行一些修改而不覆盖数组
- Javascript 覆盖对象的方法
- 保护公共方法,使其在 javascript 中被 chield 对象覆盖
- 为什么我的 JS 循环会覆盖对象中以前的条目
- 恢复覆盖的窗口.JSON 对象
- 嵌套对象相互覆盖
- 将多个对象推入JavaScript数组,但会导致对象覆盖
- 为什么可以't继承的对象覆盖继承调用中的原型函数
- 对象覆盖不起作用
- Javascript多维对象覆盖上次插入的项