对不起,转储问题我是JS新手。我想重写f2()“ class”中的D函数。但是出于某种原因,Fire Fox告诉我:“递归太多”。您能否指出我递归发生的地方以及如何使此代码按预期工作?

var B = function () {
};
B.prototype.f2 = function (x) {
    return 2 * x;
};

var C = function () {
    B.call(this);
};

var D = function () {
    C.call(this);
};

D.prototype.f2 = function (x) {
    return C.prototype.f2.call(this, x) * 7;
};

inherit(B, C);
inherit(C, D);

function inherit(Child, Parent) {
    Child.prototype = Object.create(Parent.prototype);
    Child.prototype.constructor = Child;
}

var d = new D();
console.log(d.f2(3));

最佳答案

两个问题:


在尝试向它们添加属性之前,需要设置XYZ.prototype对象。由于您的inherit函数创建了它们,因此必须确保以正确的顺序执行操作。
inherit调用中,父级和子级的顺序向后。它是inherit(child, parent),而不是inherit(parent, child)




var B = function () {
};
B.prototype.f2 = function (x) {
    return 2 * x;
};

var C = function () {
    B.call(this);
};
inherit(C, B);            // *** Moved and updated

var D = function () {
    C.call(this);
};
inherit(D, C);            // *** Moved and updated

D.prototype.f2 = function (x) {
    return C.prototype.f2.call(this, x) * 7;
};

function inherit(Child, Parent) {
    Child.prototype = Object.create(Parent.prototype);
    Child.prototype.constructor = Child;
}

var d = new D();
console.log(d.f2(3));





ES2015版本,以供比较:



class B {
  f2(x) {
    return 2 * x;
  }
}

class C extends B {
}

class D extends C {
  f2(x) {
    return super.f2(x) * 7;
  }
}

const d = new D();
console.log(d.f2(3));

10-08 04:44