Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/478.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 - Fatal编程技术网

如何在另一个类中实例化JavaScript类?

如何在另一个类中实例化JavaScript类?,javascript,Javascript,我目前正在做一个学校项目,该项目围绕着在组织中轻松获得技能展开。我创建了一个名为Employee的类,该类在localStorage中存储了一组预定义的员工(因为无法访问数据库)。员工列表通过创建列表表的函数输出 现在我想创建一个名为Skills的类,我想在Employee类中实例化Skills类。这样做的目的是,员工应该能够进入一个站点并写入他们的技能,技能必须存储到员工,并保存在localStorage中,更新到表中。 因此,我的问题是使用正确的语法/方法将一个类实例化为另一个类 class

我目前正在做一个学校项目,该项目围绕着在组织中轻松获得技能展开。我创建了一个名为Employee的类,该类在localStorage中存储了一组预定义的员工(因为无法访问数据库)。员工列表通过创建列表表的函数输出

现在我想创建一个名为Skills的类,我想在Employee类中实例化Skills类。这样做的目的是,员工应该能够进入一个站点并写入他们的技能,技能必须存储到员工,并保存在localStorage中,更新到表中。 因此,我的问题是使用正确的语法/方法将一个类实例化为另一个类

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的有用性将取决于问题,但它仍然是一个需要注意的重要模式。哦,我的错误。