在示例的名称空间中创建类时。
em.components.grid
em.components.grid.Popup = Class.create(
{
initialize: function(params){
...
},
show:function(){
// create or show
}
});
如果我使用上面的命名空间路径,这是否意味着在其他类中我可以访问show方法。
// Another class in prototype
em.components.grid.Popup.show();
或者您尝试访问show的新类必须位于同一名称空间中。
namespacing类似于其他语言的包。因此,通过提供命名空间,您可以将所有类与例如网格相关联在一个名称空间中,以及可能的其他类与另一个命名空间中的网格无关。
更新 这引发了另外两个问题,让我说我用相同的命名空间创建我的类。然后在另一个js文档中我实例化了类
var popup = new em.components.grid.Popup()
然后弹出窗口将是一个全局变量?如果可能的话,我不想在我的文件中。我看到了给它一个独特的名称空间所带来的麻烦。然后在js文件中的其他位置创建全局变量的类实例。
因此,在弹出窗口的情况下,最好将其设置为全局,或者最好是在翻转事件上创建它并在rollout事件中将其删除。
//pseudo code
$$('domelementClass').observe('mouseover', function(event) {
var popup= new em.components.grid.Popup(event.target);
})
我在上面看到的问题是我没有参考在推出时删除它。
$$('domelementClass').observe('mouseout', function(event) {
popup.remove();
})
答案 0 :(得分:0)
命名空间具有相同的包装目的,避免碰撞。如上面的示例所示,在JavaScript中,通过使函数和变量成为对象的属性来命名它们。
这是否意味着在其他类中我可以访问show方法,如果我 使用上面的命名空间路径。
//原型em.components.grid.Popup.show();
中的另一个类
在这种情况下没有因为'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();
一些有用的链接: