如何在javascript中使用原型覆盖函数?

时间:2013-08-07 16:56:10

标签: javascript prototype

在以下示例中,我希望将覆盖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();

3 个答案:

答案 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()