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和想法。
答案 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的所有当前实例都指向旧的引用。