命名空间与js原型框架

时间:2011-08-23 16:39:30

标签: prototypejs

在示例的名称空间中创建类时。

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();
   })

1 个答案:

答案 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();

一些有用的链接:

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

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