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

问题描述 投票:0回答:3

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];

只是尝试使用 JavaScript/CoffeeScript 和 Ruby 的想法。

javascript ruby coffeescript
3个回答
3
投票

不。

你可以在coffeescript中做的是

Classes = global.Classes = []

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

或在 JavaScript 中

global.Classes = {}

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

3
投票

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

语言本身实际上并不保留类或类实例的运行时可访问列表。 所以,任何你想跟踪的事情,你都必须自己做。


1
投票

您需要按照您的说明进行操作:

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

在 JavaScript 中,不包括类构造。您总是直接与对象交互并继承对象。

一个例子:

    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.prototype = { show: ... }
的操作。原因是您实际上是在为原型创建一个新引用,但 Model 的所有当前实例都指向旧引用。

© www.soinside.com 2019 - 2024. All rights reserved.