2010-05-03 46 views
1

我剛開始使用Javascript的類,並已打到牆上。我已經遍尋了一個教程,不僅僅是如何構建一個類(通常是動物),然後擴展該類,並讓方法做一些事情(Dog alert('Bark');)。如何動態實例化JavaScript中的類?

我創建了一個我希望用戶能夠實例化的類(這是正確的詞)?例如,我的程序中的第一個階段是讓用戶給這個類命名,然後開始在類中填充各種變量。當他們這樣做時,他們可能會再次多次這樣做。

EDITED,CODE OF完整的例子:

function Blind() { 
    this.Type = null; 
    this.Colour = null; 
    this.Width = 500; 
    this.Drop = 500; 
    this.Price = 0; 
} 

function BlindAluminium() { 
    Blind.call(this); 
    this.Type = 'aluminium'; 
    this.SubType = null; 
    this.StackHeight = 0; 
} 

即定義對象的代碼。

下面是HTML,這將允許用戶定義一個新的對象:

<form id="create_blind_form" name="create_blind_form" method="post" action=""> 
    <label for="blind_name">Blind Name: <input name="blind_name" id="blind_name" type="text" /></label> 
    <input name="submit" type="submit" value="Submit" /> 
</form> 

在提交,我需要一個新的對象被創建,在僞代碼,像這樣:

var *blind_name_from_the_form* = new BlindAluminium(); 

再後來,我希望採取行動,那麼這樣的:

*blind_name_from_the_form*.subType = '50mm'; 
+0

我實際上並沒有得到你的代碼行應該是什麼。類名是對象? – Matchu 2010-05-03 03:04:43

+0

你的問題沒有任何意義。JavaScript中沒有任何類,因此無法動態地實例化它們。 – 2010-05-03 03:53:54

+0

感謝您的回答,我已經添加了一個我希望實現的確切示例,我對之前的不佳示例表示歉意。 – Adam 2010-05-03 22:08:15

回答

3

也許通過將名稱存儲在另一個對象內?

var instances = {}; 
instances['theNameTheUserChose'] = new MyObject(); 
+0

這不是我採取的方法。我用這個代碼示例: 函數BlindCart(){ this.Blinds = new Array(arguments.length);對於(i = 0; i Adam 2010-05-07 23:05:49

4

簡短的回答是,你要必須使用eval。如果你想調用一個只有在運行時才知道的名字的函數(或類),那麼它就沒有辦法。

eval("var className = new MyObject();"); 

這就是說,你可能想考慮一些替代品。人們會給你各種各樣的原因,爲什麼eval是壞的,這是真的。但對我而言,沿着這條路線走下坡路將會很尷尬。是的,深入克羅克福德。

是否有可能使用Javascript的原型繼承,而不是試圖使用尷尬的類?鑑於類在Javascript中沒有任何意義,如果它們不適合這個問題,真的沒有理由使用它們。

+0

當然,這不可能是真的。如何:function a(){return'foo'} this ['a']()'?按照預期,在我的Google Chrome控制檯中評估爲「foo」。但我仍然很難理解原始問題是什麼,所以... – Matchu 2010-05-03 03:05:31

+0

@Matchu:即使您不使用「eval」,您的字符串函數調用可能會被視爲「尷尬」或糟糕的用法。但我明白你正在駁斥斷言eval是必要的 - 這是一個很好的例子。 – 2010-05-03 03:14:18

+0

+1「鑑於Javascript在JavaScript中沒有任何意義,如果它們不適合問題,那麼真的沒有理由使用它們,如果它們不適合這個問題,真的沒有理由使用它們。我沒有看到將JavaScript強制轉化爲經典的oo模式。請閱讀http://www.crockford.com/javascript/inheritance.html,特別是最後一條(增加的)行。 – KooiInc 2010-05-03 06:45:31

1

你總是需要對你的類型有一些參考。比方說你創建一個構造函數(類)並將其稱爲MyObject。如果我理解正確的使用情況,您的用戶應該能夠做這樣的事情,而不是:

var userObject = new SomethingElse(); // instead of new MyObject(); 

這是編程,所以你總是要必須明確的。你可以做這樣的事情:

var types = {}; 
types["aType"] = MyObject; 
var userObject = new types["aType"]; 

需要注意的是,即使你不喜歡上面,您的用戶將不得不知道的「類型」對象的「A型」屬性包含。你真的不能做這樣的事情:

var userObject = guessTheClassName(); 

希望這有助於。

+0

我希望我的新例子更好的描述 - 我認爲你給出的答案解決了一個問題,其中未知是=符號的另一側。 – Adam 2010-05-03 22:09:55