2011-08-23 40 views
0

在示例的名称空间中创建类时。使用js原型框架命名空间

em.components.grid

em.components.grid.Popup = Class.create(
{ 
    initialize: function(params){ 
    ... 
    }, 

    show:function(){ 
    // create or show 
    } 
}); 

这是否意味着其他类中,如果我使用上面的命名空间路径我有机会获得演出方法。

// Another class in prototype 
em.components.grid.Popup.show(); 

或者您尝试访问show的新类是否必须位于相同的命名空间中。

命名空间有点像其他语言的软件包。所以通过给定一个命名空间,你可以将所有与例如网格有关的类保存在一个名字空间中,并且可能的其他类与其他名字空间中的网格无关。

更新 这引起了其他2个问题,可以说,我创造我的课像上面相同的命名空间。然后在另一个js文件中实例化类

var popup = new em.components.grid.Popup() 

然后popup会是一个全局变量而不是?如果可能的话,我不希望在我的文件中包含这些内容。看到我已经去了给它一个独特的名字空间的所有麻烦。然后在js文件的其他地方的全局变量上创建该类的一个实例。

所以在弹出的情况下,最好是将其设置为全局,否则最好在翻转事件中将其创建并在卷展事件中将其删除。

//pseudo code 
    $$('domelementClass').observe('mouseover', function(event) { 
     var popup= new em.components.grid.Popup(event.target); 
    }) 

我在上面看到的问题是我没有参考在卷展栏上将其删除。

$$('domelementClass').observe('mouseout', function(event) { 
    popup.remove(); 
    }) 
+0

谁能解释这样对我? – Chapsterj

+0

任何人都可以帮忙吗?我更新了我的问题,以帮助更详细地解释。 – Chapsterj

回答

0

命名空间具有相同的包装目的,避免碰撞。正如你上面的例子所示,在JavaScript中,通过使它们成为对象的属性来命名空间函数和变量。

这是否意味着在其他类中我可以访问show方法,如果我使用上面的命名空间路径 。

//原型中的另一个类em.components.grid.Popup.show();

在这种情况下,no是因为'show()'是一个实例方法,所以只能在有新的Popup时调用它。你可以使用你的命名空间的Popup作为另一个类的实例,或者如果你想在Java中调用show一样的静态方法,那么你可以调用Popup.prototype.show();

var Popup = Class.create({ 
    initialize: function(params){ 
     alert("I exist"); 
    }, 

    show:function(){ 
     alert("show!"); 
    } 
}); 

// Popup.show(); // would error: 

// Uncaught TypeError: Object function klass() { 
//  this.initialize.apply(this, arguments); 
// } has no method 'show' 

Popup.prototype.show(); 

foo = new Popup(); 

foo.show(); 

一些有用的链接:

http://michaux.ca/articles/javascript-namespacing

http://blog.anselmbradford.com/2009/04/09/object-oriented-javascript-tip-creating-static-methods-instance-methods/

+0

谢谢克里克。所以这意味着foo现在是一个全局变量。在你的例子中,匹配我的命名空间也可以做到这一点。 em.components.grid.Popup.prototype。显示()。 – Chapsterj

+0

是的,这将工作。 – kreek

+0

另外一个问题,如果我用新的语法实例化类,如何在弹出的情况下删除类。所以如果我在翻转时创建了这个类,我需要在滚降时删除它。或者创建这个类然后隐藏屏幕上的元素会更好。这种方法只是创建一次。 – Chapsterj