将原型B的所有方法和属性分配给原型A吗?

时间:2019-09-02 09:43:30

标签: javascript typescript prototype mixins

我有一个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中吗?

2 个答案:

答案 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.createClassA的{​​{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"));