在以下示例中,我希望将覆盖createProduct函数。但结果是错误。
var AbstractFactory = function(){
this.createProduct = function(){
throw new Error("The createProduct() method has not been implemented.");
}
}
AbstractFactory.prototype.createProduct = function(){
console.log('The method has been overwriten successfully');
};
var factory = new AbstractFactory();
factory.createProduct();
答案 0 :(得分:4)
搜索属性从对象本身开始,并且只有在找不到属性时才会检查原型。因此,在“工厂”对象上找到的第一个“createProduct”函数是错误函数。如果您以其他顺序初始化对象和原型,那么您将获得预期的结果。
请注意,原型对象上的属性不会导致在使用构造函数创建的实例对象上存在属性。
答案 1 :(得分:1)
问题是JavaScript中没有抽象这样的东西。实现所需的一种方法是使用更模块化的方法。创建工厂对象时,可以将函数传递给将覆盖createProduct函数的AbstractFactory函数。
var AbstractFactory = function(func){
this.createProduct = func || function(){
throw new Error("The createProduct() method has not been implemented.");
}
}
var factory = new AbstractFactory(function() {
console.log('The method has been overwriten successfully');
});
factory.createProduct(); // The method has been overwriten successfully
在将func
分配给createProduct之前,您可能还需要先检查{{1}}是否为函数。
答案 2 :(得分:0)
另一个帮助一点的例子:
使用配置覆盖来实现对象。
var AbstractFactory = function(config){
this.init(config)
}
AbstractFactory.prototype ={
createProduct : function(){
console.log('The method has been overwriten successfully');
},
init : function(config){
console.log("Start my object")
if(typeof config.createProduct === "function"){
this.createProduct = config.createProduct;
}
}
}
var myConfig = {
createProduct : function(){
throw new Error("The createProduct() method has not been implemented.");
}
}
var factory = new AbstractFactory(myConfig);
factory.createProduct()