2011-10-13 46 views
1

JavaScript中是否有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的想法。

+0

什麼樣的模式是什麼?例1中的代碼根本不做任何事情,例2和'function Model(){}函數完全一樣View(){}' – user123444555621

回答

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實例指向舊引用。

4

您必須手動註冊才能獲得它們的列表。

JavaScript語言中沒有類「class」,所以語言本身並不知道它們。它們是與原型或函數一起使用的約定,以提供類似於其他語言支持的行爲。

3

沒有。

你可以在CoffeeScript中做的是

Classes = global.Classes = [] 

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

或在javascript

global.Classes = {} 

Model = Classes.Model = function(){ 
    ... 
} 
相關問題