Как мне перечислить все «классы», определенные в JavaScript? - PullRequest
1 голос
/ 13 октября 2011

Есть ли ObjectSpace в JavaScript?

Скажем, у меня есть эти "классы", определенные в изолированных замыканиях, например:

(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.

Ответы [ 3 ]

4 голосов
/ 13 октября 2011

Вы должны зарегистрировать их вручную, чтобы получить их список.

В языке javascript не существует такой вещи, как "класс", поэтому сам язык на самом деле о них не знает.Это соглашения, используемые с прототипами или функциями для обеспечения поведения, аналогичного тому, которое поддерживается в других языках.

3 голосов
/ 13 октября 2011

Нет.

Что вы можете сделать в coffeescript - это

Classes = global.Classes = []

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

или в javascript

global.Classes = {}

Model = Classes.Model = function(){
    ...
}
1 голос
/ 13 октября 2011

Вам нужно будет сделать, как вы заявили:

    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.Если свойство / метод изменяется в прототипе, все экземпляры сразу увидят это изменение, если вы не сделаете что-то вроде Model.prototype = { show: ... }.Причина в том, что вы буквально делаете новую ссылку на прототип, но все текущие экземпляры Model указывают на старую ссылку.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...