如何在javascript中动态实例化一个类?
我从Javascript类开始,遇到了麻烦。我已经找遍了一个教程,它比简单地构造一个类(通常是动物)然后扩展该类并让一个方法做一些事情(Dog alert('Bark');)更进一步 我已经创建了一个我希望用户能够实例化的类(这个词对吗)?例如,我的程序的第一个阶段是用户给类命名,然后开始填充类中的各种变量。当他们这样做了,他们可能会再做很多次 已编辑的完整代码示例:如何在javascript中动态实例化一个类?,javascript,oop,class,Javascript,Oop,Class,我从Javascript类开始,遇到了麻烦。我已经找遍了一个教程,它比简单地构造一个类(通常是动物)然后扩展该类并让一个方法做一些事情(Dog alert('Bark');)更进一步 我已经创建了一个我希望用户能够实例化的类(这个词对吗)?例如,我的程序的第一个阶段是用户给类命名,然后开始填充类中的各种变量。当他们这样做了,他们可能会再做很多次 已编辑的完整代码示例: function Blind() { this.Type = null; this.Colour = null;
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';
var types = {};
types["aType"] = MyObject;
var userObject = new types["aType"];
var userObject = guessTheClassName();
简单的回答是你必须使用。如果您想调用一个只有在运行时才知道名称的函数(或类),那么没有办法
eval("var className = new MyObject();");
正如你所说的,你可能想考虑一些替代方案。人们会给你各种各样的理由解释为什么eval不好,这是真的。但对我来说,沿着这条路走下去会很难管理。是的,深入研究克罗克福德
是否可以使用Javascript的原型继承,而不是尝试使用笨拙的类?鉴于类在Javascript中毫无意义,如果它们不适合问题,就没有理由使用它们。简单的回答是,您必须使用它们。如果您想调用一个只有在运行时才知道名称的函数(或类),那么没有办法
eval("var className = new MyObject();");
正如你所说的,你可能想考虑一些替代方案。人们会给你各种各样的理由解释为什么eval不好,这是真的。但对我来说,沿着这条路走下去会很难管理。是的,深入研究克罗克福德
是否可以使用Javascript的原型继承,而不是尝试使用笨拙的类?如果类在Javascript中没有任何意义,那么如果它们不适合问题,就没有理由使用它们。可能通过将名称存储在另一个对象中
var instances = {};
instances['theNameTheUserChose'] = new MyObject();
可能是通过将名称存储在另一个对象中
var instances = {};
instances['theNameTheUserChose'] = new MyObject();
你总是需要对你的类型有某种参考。假设您创建了一个构造函数(类)并将其称为MyObject。如果我理解正确,用例是您的用户应该能够执行以下操作:
var userObject = new SomethingElse(); // instead of new MyObject();
这是编程,所以您必须始终明确。你可以这样做:
var *blind_name_from_the_form* = new BlindAluminium();
*blind_name_from_the_form*.subType = '50mm';
var types = {};
types["aType"] = MyObject;
var userObject = new types["aType"];
var userObject = guessTheClassName();
请注意,即使您喜欢上面的内容,您的用户也必须知道“types”对象的“aType”属性包含哪些内容。你不能真的这样做:
var *blind_name_from_the_form* = new BlindAluminium();
*blind_name_from_the_form*.subType = '50mm';
var types = {};
types["aType"] = MyObject;
var userObject = new types["aType"];
var userObject = guessTheClassName();
希望这能有所帮助。你总是需要对你的类型有某种参考。假设您创建了一个构造函数(类)并将其称为MyObject。如果我理解正确,用例是您的用户应该能够执行以下操作:
var userObject = new SomethingElse(); // instead of new MyObject();
这是编程,所以您必须始终明确。你可以这样做:
var *blind_name_from_the_form* = new BlindAluminium();
*blind_name_from_the_form*.subType = '50mm';
var types = {};
types["aType"] = MyObject;
var userObject = new types["aType"];
var userObject = guessTheClassName();
请注意,即使您喜欢上面的内容,您的用户也必须知道“types”对象的“aType”属性包含哪些内容。你不能真的这样做:
var *blind_name_from_the_form* = new BlindAluminium();
*blind_name_from_the_form*.subType = '50mm';
var types = {};
types["aType"] = MyObject;
var userObject = new types["aType"];
var userObject = guessTheClassName();
希望这能有所帮助。我并没有真正理解您的代码行应该是什么。类名就是对象?你的问题没有任何意义。JavaScript中没有类,因此您无法实例化它们,无论是动态的还是非动态的。感谢您的回答,我已经添加了一个我希望实现的确切示例,我对前面的示例很抱歉。我没有真正理解您的代码行应该是什么。类名就是对象?你的问题没有任何意义。JavaScript中没有类,因此您无法实例化它们,无论是动态的还是非动态的。感谢您的回答,我已经添加了一个我希望实现的确切示例,我对前面的示例很抱歉。这肯定不是真的。怎么样:
函数a(){return'foo'}这个['a']()
?在我的Google Chrome控制台中按预期计算为“foo”。但是我仍然很难理解最初的问题是什么,所以…@Matchu:字符串中的函数调用可能会被视为“笨拙”或糟糕的用法,即使您没有同时使用eval
;然而,我知道您反驳了需要eval的断言,这是一个很好的例子。+1表示“鉴于类在Javascript中毫无意义,如果它们不适合问题,就没有理由使用它们,如果它们不适合问题,就没有理由使用它们”。我认为将javascript强制转换成经典的oo模式没有多大用处。阅读,尤其是最后一行。我将阅读Crockford,我看到下面的链接。同时,我扩展了我的例子,希望这比前一个好。当然这不可能是真的。怎么样:函数a(){return'foo'}这个['a']()
?在我的Google Chrome控制台中按预期计算为“foo”。但是我仍然很难理解最初的问题是什么,所以…@Matchu:字符串中的函数调用可能会被视为“笨拙”或糟糕的用法,即使您没有同时使用eval
;然而,我知道您反驳了需要eval的断言,这是一个很好的例子。+1表示“鉴于类在Javascript中毫无意义,如果它们不适合问题,就没有理由使用它们,如果它们不适合问题,就没有理由使用它们”。我认为将javascript强制转换成经典的oo模式没有多大用处。阅读,尤其是最后一行。我将阅读Crockford,我看到下面的链接。同时,我扩展了我的例子,希望这比前一个更好。我希望我的新例子是一个更好的描述-我认为你给出的答案解决了一个未知是未知的问题