如何在另一个类中实例化JavaScript类?
我目前正在做一个学校项目,该项目围绕着在组织中轻松获得技能展开。我创建了一个名为Employee的类,该类在localStorage中存储了一组预定义的员工(因为无法访问数据库)。员工列表通过创建列表表的函数输出 现在我想创建一个名为Skills的类,我想在Employee类中实例化Skills类。这样做的目的是,员工应该能够进入一个站点并写入他们的技能,技能必须存储到员工,并保存在localStorage中,更新到表中。 因此,我的问题是使用正确的语法/方法将一个类实例化为另一个类如何在另一个类中实例化JavaScript类?,javascript,Javascript,我目前正在做一个学校项目,该项目围绕着在组织中轻松获得技能展开。我创建了一个名为Employee的类,该类在localStorage中存储了一组预定义的员工(因为无法访问数据库)。员工列表通过创建列表表的函数输出 现在我想创建一个名为Skills的类,我想在Employee类中实例化Skills类。这样做的目的是,员工应该能够进入一个站点并写入他们的技能,技能必须存储到员工,并保存在localStorage中,更新到表中。 因此,我的问题是使用正确的语法/方法将一个类实例化为另一个类 class
class Skills{
constructor(sId){
this.sId = sId;
}
}
if (localStorage.getItem("Skills") == null) {
var skillList =[];
var skillListString = JSON.stringify(skillList);
localStorage.setItem("skills",skillListString);
} else {
var skillListString = JSON.parse(localStorage.getItem("Skills"));
class Employee {
// vi bruger en constructor funktion for at lave en opskrift på objekter af en bestemt type.
//this metoden benyttes til at referere til det tilhørende objekt
constructor(name, gender, department, yy, email, skills) {
this.name = name;
this.gender = gender;
this.department = department;
this.email = email;
this.skills = [];
}
}
//Employee Database "Localstorage"
if(localStorage.getItem("Employee") == null) {
let employeeList = [];
employeeList.push (new Employee("Simon", "Male", "HR", 1999, "2650@mail.dk"));
employeeList.push (new Employee("Mads", "Male","IT", 1999, "1234@email.com"));
employeeList.push (new Employee("Jessica", "Female", "Sales",1998, "Mail2@mail.dk"));
employeeList.push (new Employee("Benjamin", "Male","IT", 1997, "blabla@mail.dk"));
if(localStorage.getItem("Employee") == null) {
employeeListString = JSON.stringify(employeeList);
localStorage.setItem("Employee", employeeListString);
employeeList = JSON.parse(localStorage.getItem("Employee"));
}
} else {
employeeList = JSON.parse(localStorage.getItem("Employee"));
document.querySelector("#employees").appendChild(buildTable(employeeList));
}
您可以从另一个类中实例化一个类,就像您总是用关键字
new
实例化一个类一样
例如:
class Foo{}
分类栏{
构造函数(){
this.foo=new foo()
}
}
bar=新的bar()
在设计方面,您可能会发现最好是“注入”类依赖项。这通常会产生更多可测试和可维护的代码。有一些很好的例子
例如:
class Foo{}
分类栏{
建造师(foo){
this.foo=foo
}
}
foo=新foo()
酒吧=新酒吧(foo)
您可以从另一个类中实例化一个类,就像您总是用关键字new
实例化一个类一样
例如:
class Foo{}
分类栏{
构造函数(){
this.foo=new foo()
}
}
bar=新的bar()
在设计方面,您可能会发现最好是“注入”类依赖项。这通常会产生更多可测试和可维护的代码。有一些很好的例子
例如:
class Foo{}
分类栏{
建造师(foo){
this.foo=foo
}
}
foo=新foo()
酒吧=新酒吧(foo)
您完全可以将实例化的类存储为属性:
//在构造函数中创建实例
阶级人{
构造函数(名称、类别名称){
this.name=name
this.cat=新的cat(cat\u名称)
}
}
//或传递已构造的实例
阶级人
构造函数(名称,类别){
this.name=name
这只猫
}
}
但还有一个不太明显的问题:JSON没有自定义类型,因此它只能存储普通的JS对象、数组和一些原语,如字符串和数字
所以自定义类(尤其是存储在属性中的类)将无法在默认序列化/反序列化往返过程中生存。您不能像使用普通JS对象那样轻松地存储引用。您必须自己完成,例如,您可以将每个类转换为{type:'human',fields:{name:'John'}}
对象,该对象可以安全地序列化为JSON
class Human {
constructor(name, cat) {
this.name = name
this.cat = cat
}
serialize() {
return { type: 'Human', fields: { cat: this.cat.serialize(), name: this.name }}
}
}
然后根据
类型进行反序列化,根据需要调用构造函数。您完全可以将实例化的类存储为属性:
//在构造函数中创建实例
阶级人{
构造函数(名称、类别名称){
this.name=name
this.cat=新的cat(cat\u名称)
}
}
//或传递已构造的实例
阶级人
构造函数(名称,类别){
this.name=name
这只猫
}
}
但还有一个不太明显的问题:JSON没有自定义类型,因此它只能存储普通的JS对象、数组和一些原语,如字符串和数字
所以自定义类(尤其是存储在属性中的类)将无法在默认序列化/反序列化往返过程中生存。您不能像使用普通JS对象那样轻松地存储引用。您必须自己完成,例如,您可以将每个类转换为{type:'human',fields:{name:'John'}}
对象,该对象可以安全地序列化为JSON
class Human {
constructor(name, cat) {
this.name = name
this.cat = cat
}
serialize() {
return { type: 'Human', fields: { cat: this.cat.serialize(), name: this.name }}
}
}
然后根据类型
反序列化,根据需要调用构造函数。提到您以前的编程语言可能会有所帮助。我的意思是,在javascript世界中,您的问题听起来根本不是问题。与在其他任何地方实例化它一样,newsomeclass()
。您已经表明您知道如何在代码中实例化Employee
类。对Skills
@appleapple执行同样的操作(这里有一个JS标记;)@我的问题是,我不知道如何在我的员工课程中使用我的技能课程。提到你以前的编程语言可能会有所帮助。我的意思是,在javascript世界中,您的问题听起来根本不是问题。与在其他任何地方实例化它一样,newsomeclass()
。您已经表明您知道如何在代码中实例化Employee
类。对Skills
@appleapple执行同样的操作(这里有一个JS标记;)@我的问题是,我不知道如何在我的员工类别中使用我的技能类别,我认为它应该通过实例而不是类型。(顺便说一句,我个人不喜欢DI)@appleapple我相信我正在传递一个实例。DI的有用性将取决于问题,但它仍然是一个需要注意的重要模式。哦,我的错误。我认为它应该通过实例而不是类型。(顺便说一句,我个人不喜欢DI)@appleapple我相信我正在传递一个实例。DI的有用性将取决于问题,但它仍然是一个需要注意的重要模式。哦,我的错误。