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 的想法。
不。
你可以在coffeescript中做的是
Classes = global.Classes = []
Classes.push class Model
constructor: -> ...
或在 JavaScript 中
global.Classes = {}
Model = Classes.Model = function(){
...
}
您必须手动注册它们才能获得它们的列表。
语言本身实际上并不保留类或类实例的运行时可访问列表。 所以,任何你想跟踪的事情,你都必须自己做。
您需要按照您的说明进行操作:
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 的所有当前实例都指向旧引用。