gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-03 03:05:29 25 4
gpt4 key购买 nike

我非常熟悉原型(prototype),现在我尝试通过测试类在编译时的底层外观并将其与“原型(prototype)”方法进行比较来了解类的工作原理。

当我使用原型(prototype)时,我可以使用 Object.setPrototypeOf 将一个对象“扩展”到另一个对象方法。我将 [Object] 类型的任何内容作为第二个参数传递,并且它可以工作,但是当我使用 extends 时关键字 class ,它只需要另一个 [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 ,似乎没有使用纯原型(prototype)那么灵活。

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

最佳答案

How can I get the same result with the class and extends?

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

Object.setPrototypeOf(Student.prototype, Citizen.prototype);

同样,你的类方法应该如下所示:

class Student extends Citizen

如果出于某种原因您希望您的学生有一个硬编码的国家/地区,那么您可以这样做:

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

关于javascript - 如何在javascript中将类扩展到类实例?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47187230/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com