我很熟悉原型,现在我尝试通过在编译时测试它们在引擎盖下的样子来理解类的工作方式,并将其与“原型”方法进行比较。
当我使用原型时,我可以使用Object.setPrototypeOf
方法将一个对象“扩展”到另一个对象。我将[Object]类型的任何内容作为第二个参数传递并且它可以正常工作,但是当我将extends
关键字与class
一起使用时,它只需要另一个[类]类型对象。
这是一种有效的prototype
方法:
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
因此,我将学生“扩展”为公民 instance
而不是Citizen
本身(构造函数)。它工作得很好。我可以访问Citizen
实例(student.contry
)的属性。
如何使用class
和extends
获得相同的结果?
我想在下面的代码中实现类似的东西,但它会抛出错误:Class extends value #<Citizen> is not a constructor or 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
答案 0 :(得分:1)
如何在课堂上获得相同的结果并进行扩展?
你不能(-ish)。但更重要的是,你不应该这样做。即使采用原型方法,您仍然不应该这样做。您的原型方法应如下所示:
Object.setPrototypeOf(Student.prototype, Citizen.prototype);
同样,你的班级方法应如下所示:
class Student extends Citizen
如果由于某种原因你希望你的学生有一个硬编码的国家,那你就这样做:
class Student extends Citizen {
constructor(subject) {
super("USA");
this.subject = subject;
}
}