Javascript继承和函数重写 你好,我有下面的“OOP”结构,我想模仿C++中的虚拟函数。所以我在StateConstructor中有基本虚函数,每个子类有不同的实现 // Base state class ------------------------- function StateConstuctor() { } // Inherited learn class -------------------- function StateLearnConstructor() { } // Inherited exam class --------------------- function StateExamConstructor() { } function extend(Child, Parent) { var F = function() { } F.prototype = Parent.prototype Child.prototype = new F() Child.prototype.constructor = Child Child.superclass = Parent.prototype } function createState(rollType) { if (rollType == 'learn') { extend(StateLearnConstructor, StateConstuctor); var state = new StateLearnConstructor(); return state; } else if (rollType == 'exam') { extend(StateExamConstructor, StateConstuctor); var state = new StateExamConstructor(); return state; } } StateConstuctor.prototype.getTitles = function() { console.log('base "virtual" function'); } StateLearnConstructor.prototype.getTitles = function() { console.log('learn'); } StateExamConstructor.prototype.getTitles = function() { console.log('exam'); }

Javascript继承和函数重写 你好,我有下面的“OOP”结构,我想模仿C++中的虚拟函数。所以我在StateConstructor中有基本虚函数,每个子类有不同的实现 // Base state class ------------------------- function StateConstuctor() { } // Inherited learn class -------------------- function StateLearnConstructor() { } // Inherited exam class --------------------- function StateExamConstructor() { } function extend(Child, Parent) { var F = function() { } F.prototype = Parent.prototype Child.prototype = new F() Child.prototype.constructor = Child Child.superclass = Parent.prototype } function createState(rollType) { if (rollType == 'learn') { extend(StateLearnConstructor, StateConstuctor); var state = new StateLearnConstructor(); return state; } else if (rollType == 'exam') { extend(StateExamConstructor, StateConstuctor); var state = new StateExamConstructor(); return state; } } StateConstuctor.prototype.getTitles = function() { console.log('base "virtual" function'); } StateLearnConstructor.prototype.getTitles = function() { console.log('learn'); } StateExamConstructor.prototype.getTitles = function() { console.log('exam'); },javascript,oop,inheritance,Javascript,Oop,Inheritance,但此代码调用StateConstructorbase虚拟函数。这里出了什么问题?createState()在为您的StateLearnConstructor和StateExamConstructor分配函数后,正在覆盖原型 你不应该有条件地扩展它们。只要扩展它们: var state = createState('exam'); state.getTitles(); 一旦你这样做了,你的“虚拟功能”就应该像预期的那样工作 注意:您对extend()的实现比需要的复杂得多。继承原型的现代方法是

但此代码调用
StateConstructor
base虚拟函数。这里出了什么问题?

createState()
在为您的
StateLearnConstructor
StateExamConstructor
分配函数后,正在覆盖原型

你不应该有条件地扩展它们。只要扩展它们:

var state = createState('exam');
state.getTitles();
一旦你这样做了,你的“虚拟功能”就应该像预期的那样工作

注意:您对
extend()
的实现比需要的复杂得多。继承原型的现代方法是使用
Object.create()


未调用状态构造函数@奥利奥-这不是重点吗?混合继承将StateConstructor的原型设置为state,但调用的构造函数是代码中所示的检查构造函数。@TravisJ不确定它应该如何工作,但OP说“此代码调用
StateConstructor
”。“我不能复制它。”Oriol不,OP说“这段代码调用StateConstructor基虚函数”。换句话说,“此代码调用
StateConstructor
上的基本虚拟函数”。
extend(StateLearnConstructor, StateConstuctor);
extend(StateExamConstructor, StateConstuctor);

StateConstuctor.prototype.getTitles = function () {
    console.log('base "virtual" function');
};
StateLearnConstructor.prototype.getTitles = function () {
    console.log('learn');
};
StateExamConstructor.prototype.getTitles = function () {
    console.log('exam');
};

function createState(rollType) {
    if (rollType == 'learn') {
        return new StateLearnConstructor();
    } else if (rollType == 'exam') {
        return new StateExamConstructor();
    }
}
function extend(Child, Parent) {
    Child.prototype = Object.create(Parent.prototype);
    Child.prototype.constructor = Child;
    Child.superclass = Parent.prototype;
}