Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/oop/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何在javascript中动态实例化一个类?_Javascript_Oop_Class - Fatal编程技术网

如何在javascript中动态实例化一个类?

如何在javascript中动态实例化一个类?,javascript,oop,class,Javascript,Oop,Class,我从Javascript类开始,遇到了麻烦。我已经找遍了一个教程,它比简单地构造一个类(通常是动物)然后扩展该类并让一个方法做一些事情(Dog alert('Bark');)更进一步 我已经创建了一个我希望用户能够实例化的类(这个词对吗)?例如,我的程序的第一个阶段是用户给类命名,然后开始填充类中的各种变量。当他们这样做了,他们可能会再做很多次 已编辑的完整代码示例: function Blind() { this.Type = null; this.Colour = null;

我从Javascript类开始,遇到了麻烦。我已经找遍了一个教程,它比简单地构造一个类(通常是动物)然后扩展该类并让一个方法做一些事情(Dog alert('Bark');)更进一步

我已经创建了一个我希望用户能够实例化的类(这个词对吗)?例如,我的程序的第一个阶段是用户给类命名,然后开始填充类中的各种变量。当他们这样做了,他们可能会再做很多次

已编辑的完整代码示例:

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,我看到下面的链接。同时,我扩展了我的例子,希望这比前一个更好。我希望我的新例子是一个更好的描述-我认为你给出的答案解决了一个未知是未知的问题