我有一个A类,它是B类的子集。它共享B类的许多属性和方法。
尽管A类缺少实现。所以我希望B类的所有功能都可以归入A类。
ClassA.prototype = ClassB.prototype;
或
ClassA.prototype += ClassB.prototype
但似乎我必须:
ClassA.prototype.methodA = ClassB.prototype.methodA
ClassA.prototype.methodB = ClassB.prototype.methodB
ClassA.prototype.methodC = ClassB.prototype.methodC
ClassA.prototype.methodD = ClassB.prototype.methodD
用于每个单独的方法和属性。我无法立即将B中的实现放到A中吗?
答案 0 :(得分:2)
是的,您不能覆盖通过prototype
语法创建的函数的class
属性,因为它既是只读的,也是不可配置的。如果您使用function
语法代替Fullstack Guy points out,则可以这样做。
但是您可能想进行ClassA
扩展 ClassB
:
class ClassA extends ClassB {
// ...
}
实时示例:
class ClassB {
methodA() {
console.log("methodA");
}
methodB() {
console.log("methodB");
}
methodC() {
console.log("methodC");
}
methodD() {
console.log("methodD");
}
}
class ClassA extends ClassB {
// ...
}
new ClassA().methodA();
但是,如果没有,则可以使用循环复制所有方法:
for (const name of Object.getOwnPropertyNames(ClassB.prototype)) {
const method = ClassB.prototype[name];
if (typeof method === "function") {
ClassA.prototype[name] = ClassB.prototype[name];
}
}
实时示例:
class ClassB {
methodA() {
console.log("methodA");
}
methodB() {
console.log("methodB");
}
methodC() {
console.log("methodC");
}
methodD() {
console.log("methodD");
}
}
class ClassA {
// ...
}
for (const name of Object.getOwnPropertyNames(ClassB.prototype)) {
const method = ClassB.prototype[name];
if (typeof method === "function") {
ClassA.prototype[name] = ClassB.prototype[name];
}
}
new ClassA().methodA();
但是请注意,如果ClassB
是子类,则方法中的super
将继续访问ClassB
的超类方法,它将无效或访问{{1 }}的超类方法。
答案 1 :(得分:1)
您可以使用Object.create
从ClassA
的{{1}}继承prototyoe
的原型:
ClassB
以上内容是针对函数构造函数的,如果您想使用ES6类,则只需function ClassB(){
}
ClassB.prototype.methodA = function(){
console.log("methodA");
}
function ClassA(){
//no implementation
}
//Make the prototype of Class A inherit from the ptottype of Class B
ClassA.prototype = Object.create(ClassB.prototype);
const classA = new ClassA();
classA.methodA();
extend
:
ClassB
@ T.J。 Crowder正确地指出class ClassB{
methodA(){ console.log("methodA"); }
}
class ClassA extends ClassB{
}
const classA = new ClassA();
classA.methodA();
// When you extend another class, the instance methods of super class are inherited
// in the prototype property of the child class
ClassA.prototype.methodA();
对象的prototype
属性是不可配置的,因此,您不能为其分配另一个对象。同样,一旦将class
设置为configurable
,就无法将true
更改为false
。唯一的选择是循环复制成员函数。
您可以通过Object.getOwnPropertyDescriptor()
方法进行验证:
class ClassA{
}
//configurable and writable is false
console.log(Object.getOwnPropertyDescriptor(ClassA, "prototype"));