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

时间:2016-06-01 11:20:30

标签: javascript design-patterns factory-method

那么如何在JavaScript中使用抽象工厂方法呢?例如在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

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

2 个答案:

答案 0 :(得分:1)

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

return this.bar();

答案 1 :(得分:1)

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

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

with:

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

};

你的例子有效。 您也可以使用:

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

但是,您只需调用return this.bar()并且原型遍历将由Javascript自动执行,直到在原型链中找到该方法。