2010-05-03 95 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