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

如何在javascript中将类扩展到类实例上?

如何在javascript中将类扩展到类实例上?,javascript,class,oop,prototype,extends,Javascript,Class,Oop,Prototype,Extends,我非常熟悉原型,现在我试图通过测试类在编译时的外观来理解类是如何工作的,并将其与“原型”方法进行比较 当我使用原型时,我可以使用object.setPrototypeOf方法将一个对象“扩展”到另一个对象。我将[Object]类型的任何对象作为第二个参数传递,并且它可以工作,但是当我将扩展关键字与类一起使用时,它只需要另一个[class]类型的对象 这是工作的原型式方法: function Citizen(country){ this.country = country; } functi

我非常熟悉原型,现在我试图通过测试类在编译时的外观来理解类是如何工作的,并将其与“原型”方法进行比较

当我使用原型时,我可以使用
object.setPrototypeOf
方法将一个对象“扩展”到另一个对象。我将[Object]类型的任何对象作为第二个参数传递,并且它可以工作,但是当我将
扩展
关键字与
一起使用时,它只需要另一个[class]类型的对象

这是工作的
原型
式方法:

function Citizen(country){
  this.country = country;
}

function Student(subject){
  this.subject = subject;
}


Object.setPrototypeOf(Student.prototype,new Citizen('Poland'));

var student = new Student('IT');
console.log(student.subject); //IT
console.log(student.country); //Poland
因此,我将学生“扩展”到公民
实例上,而不是公民
本身(构造函数)。而且效果很好。我有权访问
Citizen
实例(
student.contry
)的属性

如何使用
扩展
获得相同的结果? 我想在下面的代码中实现类似的功能,但它会引发错误:
类扩展值#不是构造函数或null,这似乎不像使用纯原型那么灵活

class Citizen {
  constructor(subject){
    this.subject = subject;
  }
}

class Student extends new Citizen('USA') { 
  //this expects CLASS rather than instance of the class
  //Error: Class extends value #<Citizen> is not a constructor or null
  constructor(subject){
    this.subject = subject;
  }
}

var student = new Student('law');

console.log(student.subject); //law
阶级公民{
建造师(科目){
this.subject=主语;
}
}
班级学生扩展新公民('USA'){
//这需要类而不是类的实例
//错误:类扩展值#不是构造函数或null
建造师(科目){
this.subject=主语;
}
}
var学生=新学生(“法律”);
控制台日志(学生主题)//法律
如何使用类和扩展获得相同的结果

你不能。但更重要的是,你不应该。即使使用原型方法,您仍然不应该这样做。您的原型方法应如下所示:

Object.setPrototypeOf(Student.prototype, Citizen.prototype);
class Student extends Citizen
class Student extends Citizen {
    constructor(subject) {
        super("USA");
        this.subject = subject;
    }
}
同样,你的课堂教学方法应该是这样的:

Object.setPrototypeOf(Student.prototype, Citizen.prototype);
class Student extends Citizen
class Student extends Citizen {
    constructor(subject) {
        super("USA");
        this.subject = subject;
    }
}
如果出于某种原因,你希望你的学生拥有一个硬编码的国家,那么你可以这样做:

Object.setPrototypeOf(Student.prototype, Citizen.prototype);
class Student extends Citizen
class Student extends Citizen {
    constructor(subject) {
        super("USA");
        this.subject = subject;
    }
}

“它工作得很好。”-不要为此使用
Object.setPrototypeOf
。不知道你是从哪里得到的。“
似乎没有使用纯原型那么灵活。”-它从来就没有这么做过。“类提供了一个相对刚性的框架,很难搞乱。”来自mdn的Bergi说。为什么?@PawełNo,
extends
很好——它更类似于
Object.create
,而不是
setPrototypeOf