那么如何在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
。
那么,正确的方法是什么?谢谢你!
答案 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自动执行,直到在原型链中找到该方法。