如何列出JavaScript中定义的所有“类”?

时间:2011-10-13 05:21:50

标签: javascript ruby coffeescript

JavaScript中是否有ObjectSpace

假设我在这样的隔离闭包中定义了这些“类”:

(function() {
  var Model;
  Model = (function() {
    function Model() {}
    return Model;
  })();
}).call(this);

(function() {
  var View;
  View = (function() {
    function View() {}
    return View;
  })();
}).call(this);

(function() {
  var Controller;
  Controller = (function() {
    function Controller() {}
    return Controller;
  })();
}).call(this);

有没有办法在JavaScript中查找所有这些自定义类?类似的东西:

Object.classes;

即使它们都在同一范围内,是否可能?

var Model;
Model = (function() {
  function Model() {}
  return Model;
})();

var View;
View = (function() {
  function View() {}
  return View;
})();

或者我只需要手动注册它们吗?也许像:

var ObjectSpace = {};
ObjectSpace.classes = [Model, View, Controller];

只需使用来自Ruby的JavaScript / CoffeeScript和想法。

3 个答案:

答案 0 :(得分:4)

您必须手动注册才能获得它们的列表。

javascript语言中没有“class”这样的东西,所以语言本身实际上并不知道它们。它们是与原型或函数一起使用的约定,用于提供类似于其他语言支持的行为。

答案 1 :(得分:3)

不。

你可以在coffeescript中做些什么

Classes = global.Classes = []

Classes.push class Model
    constructor: -> ...

或在javascript中

global.Classes = {}

Model = Classes.Model = function(){
    ...
}

答案 2 :(得分:1)

你需要按照你的说法去做:

    ObjectSpace = {};
    ObjectSpace.classes = [Model, View, Controller];

在JavaScript中,不包括类构造。您始终直接与Objects交互并继承。

一个例子:

    function Model(name) {
        this.name = name;
    };
    Model.prototype.show = function() {
        alert('This model has name: '+this.name);
    };
    var model = new Model('test');
    model.show();   // 'This model has name: test'

当您使用new关键字时,js解释器将首先在新实例中建立到构造函数原型的原型链接。该原型对象将在例如Model的所有实例中共享。如果在原型上更改了属性/方法,则除非您执行Model.prototype = { show: ... }之类的操作,否则所有实例都会立即看到该更改。原因是你实际上是为原型做了一个新的引用,但Model的所有当前实例都指向旧的引用。