gpt4 book ai didi

javascript - 是否可以在声明后扩展 JavaScript 类?

转载 作者:行者123 更新时间:2023-11-30 19:23:34 25 4
gpt4 key购买 nike

假设我们有以下代码...

class Person {
sayHello() {
console.log('hello');
}

walk() {
console.log('I am walking!');
}
}

class Student extends Person {
sayGoodBye() {
console.log('goodBye');
}

sayHello() {
console.log('hi, I am a student');
}
}

var student1 = new Student();
student1.sayHello();
student1.walk();
student1.sayGoodBye();

// check inheritance
console.log(student1 instanceof Person); // true
console.log(student1 instanceof Student); // true

这很好...但是现在假设 Student 类在它的声明中没有扩展 Person class Student extends Person { 变成 class Student {

现在我们有了 Person 类和 Student 类。

有没有办法让 Student 扩展 Person 而无需在类声明中使用 extends

编辑:[更多细节]

我使用此模式的原因是因为我想使用 Mongoose 的 extends Model 但我是在 node_module 而不是后端 API 中创建模型对象。这样我就可以在前端和后端使用共享类,减少冗余代码。我显然不能在前端使用 Mongoose ,所以我只会在后端扩展该功能。

最佳答案

class 是不可能的,因为一个“类”要扩展另一个类,它的原型(prototype)必须是另一个类的实例,当你使用 class 关键字,prototype 属性不可配置:

console.log(Object.getOwnPropertyDescriptor((class {}), 'prototype'));

如果您要改用函数类,则可以使用它来更改父类。

const change_parent = (clazz, new_parent) => {
clazz.prototype = Object.assign(Object.create(new_parent.prototype), clazz.prototype);
};

否则,您必须创建一个新类才能拥有不同的父类。

const with_new_parent = (clazz, new_parent) => {
class C extends new_parent {};
Object.assign(C.prototype, clazz.prototype);
return C;
};

用法:

const change_parent = (clazz, new_parent) => {
clazz.prototype = Object.assign(Object.create(new_parent.prototype), clazz.prototype);
};

class Person {
sayHello() {
console.log('hello');
}

walk() {
console.log('I am walking!');
}
}

function Student() {}

Student.prototype = {
constructor: Student,
sayGoodBye() {
console.log('goodBye');
},
sayHello() {
console.log('hi, I am a student');
}
};

var student1 = new Student();
student1.sayHello();
console.log('student1 has walk:', 'walk' in student1); // false; not a Person
student1.sayGoodBye();

// check inheritance
console.log('student1 instanceof Person:', student1 instanceof Person); // false
console.log('student1 instanceof Student:', student1 instanceof Student); // true

change_parent(Student, Person);

student1 = new Student();
student1.sayHello();
console.log('student1 has walk:', 'walk' in student1); // true; now a Person
student1.walk();
student1.sayGoodBye();

// check inheritance
console.log('student1 instanceof Person:', student1 instanceof Person); // true
console.log('student1 instanceof Student:', student1 instanceof Student); // true


看到您的编辑后,像这样实现您想要的效果会容易得多:

class MyModel extends (is_nodejs ? Model : Object) {
// ...
};

关于javascript - 是否可以在声明后扩展 JavaScript 类?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57172836/

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