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会自动执行原型遍历,直到在原型链中找到该方法。
那么如何在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会自动执行原型遍历,直到在原型链中找到该方法。