当这种继承扩展到多个对象之间时,我在javascript原型继承方面遇到了一些问题:当然,我做错了什么,但目前我无法理解什么。
当扩展已经扩展原型的原型时,整个原型的继承系统似乎失去了可用的方法。
举个例子:
考虑以下对象
这里是这些对象的一个例子,我已经对它们进行了定义:
对象A
function A () {
this.someproperty = someValue;
}
A.prototype.ab = function () {
// does something
}
A.prototype.cd = function () {
// does something
}对象B
function B () {
A.call(this);
this.someOtherProperty = someValue;
}
B.prototype = A.prototype;
B.prototype.constructor = B;对象C
function C () {
B.call(this);
}
C.prototype = B.prototype;
C.prototype.constructor = C;
C.prototype.ef = function () {
// does something
}对象D
function D () {
C.call(this);
this.someOtherProperty = someValue;
}
D.prototype = C.prototype;
D.prototype.constructor = D;考虑到上面的例子,我期望将变量初始化为"new“,这样的变量应该有可用的方法ab、cd和ef,可以用
相反,所有这些似乎都是没有定义的。
请考虑一下,如果我将“新B”初始化为:
定义和工作
,我是不是做错了什么,或者原型继承不能扩展到多个对象上?
谢谢!
发布于 2019-09-11 09:55:37
B.prototype = A.prototype;这不是继承,而是覆盖:A.prototype和B.prototype成为同一个对象。它应该是
B.prototype = Object.create(A.prototype);发布于 2019-09-11 10:14:38
下面是用ES6类重新编写的代码。@mbojko的答案是非常正确的(所以请接受一个,而不是这个,因为@mbojko直接回答了您的问题),但是,如果您要使用这种类型的深度类继承(许多人会争辩说您不应该使用--我倾向于认为有些问题是正确的,但您肯定需要谨慎),我建议使用ES6类来代替--使用更清晰的语法和更多的防范错误用法。
class A{
constructor (){
this.someproperty = 0;
}
ab(){
//...
return "called ab method"
}
cd(){
//...
}
}
class B extends A{
constructor(){
super();
this.someOtherProperty = 1;
}
}
class C extends B{
ef(){
//...
}
}
class D extends C{
constructor(){
super();
this.someOtherProperty = 2;
}
}
const d=new D();
console.log(d.ab());https://stackoverflow.com/questions/57886467
复制相似问题