继承并使用超类';javascript中的s构造函数

继承并使用超类';javascript中的s构造函数,javascript,inheritance,Javascript,Inheritance,我想知道是否可以通过自动使用超类的构造函数在javascript中实例化子类。 考虑这一点(灵感): 但是,在第一个示例中,我遇到了以下代码行: Cat.prototype.constructor = Cat; //Otherwise instances of Cat would have a constructor of Mammal 我认为这正是我所需要的:A1和A2的实例具有A的构造函数。不幸的是,注释掉A1.prototype.constructor=A1并清空A1的主体(同样适用于A

我想知道是否可以通过自动使用超类的构造函数在javascript中实例化子类。
考虑这一点(灵感):

但是,在第一个示例中,我遇到了以下代码行:

Cat.prototype.constructor = Cat;
//Otherwise instances of Cat would have a constructor of Mammal
我认为这正是我所需要的:
A1
A2
的实例具有
A
的构造函数。不幸的是,注释掉
A1.prototype.constructor=A1
并清空
A1
的主体(同样适用于
A2
)不起作用:

function A1() {}
A1.prototype = new A();

function A2() {}
A2.prototype = new A();

var a1 = new A1("foo").whatAmI(); //I'm an instance of A1, my prop is undefined
var a2 = new A2("bar").whatAmI(); //I'm an instance of A2, my prop is undefined
最后,将
A
的构造函数更改为使用
arguments
对象而不是显式传递
prop
也没有效果:

function A() {
    this.prop = arguments[0];
}
甚至可以通过稍微摆弄
prototype
属性来实现我想要的吗

我想这正是我需要的:A1和A2的实例 具有A的构造函数

不,他们不是这个意思。
A1
A2
函数仍然是它们自己调用的构造函数,您无法更改它们

本文描述的问题是,当覆盖
AX.prototype
时,所有实例继承以指出其构造函数的
.constructor
属性不再有效。另见(和相关问题)

不幸的是,注释掉了
A1.prototype.constructor=A1
和 清空A1的主体(A2也一样)不起作用

通过清空身体,它不再做任何事情。您仍然需要显式地调用
A
,这是无法避免的。你可以做的是创建一个泛型工厂,为
a
创建子类,它不做任何特殊的事情,但我认为这不值得

哦,别忘了:

我想这正是我需要的:A1和A2的实例 具有A的构造函数

不,他们不是这个意思。
A1
A2
函数仍然是它们自己调用的构造函数,您无法更改它们

本文描述的问题是,当覆盖
AX.prototype
时,所有实例继承以指出其构造函数的
.constructor
属性不再有效。另见(和相关问题)

不幸的是,注释掉了
A1.prototype.constructor=A1
和 清空A1的主体(A2也一样)不起作用

通过清空身体,它不再做任何事情。您仍然需要显式地调用
A
,这是无法避免的。你可以做的是创建一个泛型工厂,为
a
创建子类,它不做任何特殊的事情,但我认为这不值得

哦,别忘了:


你为什么要清空尸体?只是不要重置构造函数,你应该得到你想要的结果。你为什么要清空实体?只是不要重置构造函数,你应该得到你想要的结果。
function A() {
    this.prop = arguments[0];
}
Cat.prototype.constructor = Cat;
//Otherwise instances of Cat would have a constructor of Mammal
subclass(parent) {
    function Child() {
        parent.apply(this, arguments);
    }
    Child.prototype = Object.create(parent.prototype);
    Child.prototype.constructor = Child;
    return Child;
}
function A(prop) {
    this.prop = prop;
}
A.prototype.whatAmI = function() {
    console.log(
        "I'm an instance of %s, my prop is %s",
        this instanceof A1? "A1" : "A2",
        this.prop
    );
};
var A1 = subclass(A),
    A2 = subclass(A);