JavaScript如何实现抽象工厂方法?

How to implement abstract factory method in JavaScript?

那么如何在Java脚本中使用抽象工厂方法呢?例如 Java:

public abstract class SuperClass {
    abstract String bar();

    public String foo() {
        return bar();
    }
}

public class SubClass extends SuperClass{
    @Override
    String bar() {
        return "bar";
    }
}

public class Test {
    public static void main(String[] args) {
        System.out.println(new SubClass().foo());
    }
}

它显示 bar 很好。但是当我在 JavaScript:

中尝试这个时
var SuperClass = function () {};
SuperClass.prototype.foo = function () {
    return this.prototype.bar();
};

var SubClass = function () {};
SubClass.prototype = Object.create(SuperClass.prototype);
SubClass.prototype.constructor = SubClass;

SubClass.prototype.bar = function () {
    return "bar";
};

var myClass = new SubClass();
console.log(myClass.foo());

我得到 Uncaught TypeError: Cannot read property 'bar' of undefined。我跟踪了这​​个错误,结果是,当 SuperClass.prototype.foo 被执行时, SubClass.prototype 仍然是 undefined.

那么,正确的做法是什么?谢谢!

您不应在原型上访问 bar。只需在实例上访问它:

return this.bar();

您可以通过__proto__ 字段访问对象的原型。 所以,如果你改变 :

SuperClass.prototype.foo = function () {
    return this.prototype.bar();
};

与 :

SuperClass.prototype.foo = function () {
    return this.__proto__.bar();

};

您的示例有效。 您还可以使用:

return Object.getPrototypeOf(this).bar();
return this.constructor.prototype.bar();

但是,你可以只调用return this.bar(),Javascript会自动执行原型遍历,直到在原型链中找到该方法。