仅当Javascript方法不存在时才覆盖它

时间:2010-08-24 20:08:22

标签: javascript methods override parent

我的目标是覆盖未找到的方法,否则使用原始方法(对于我无法改变的库的向后兼容性)。

这是我到目前为止所做的,但我仍然在努力:

this.grid.getDataSource = function(){
        if (typeof this.grid.getDataSource.getDataSource == "undefined")
            return this.grid.getDataSource.getStore();
            else return this.grid.getDataSource.getDataSource();
    }

我想让getDatasource()检查它是否存在,如果不存在,请调用getStore()。如果确实存在,只需使用原始的getDatasource()。我知道这会中断,因为我还没弄明白如何引用父'this'范围。当我解决这个问题时,我会进入一个递归循环,因为它一直试图覆盖它自己。如果你有更好的方法,请告诉我!

2 个答案:

答案 0 :(得分:1)

我认为这应该做你想要的。

this.grid.getDataSource = 
    this.grid.getDataSource.getDataSource || this.grid.getDataSource.getStore;

这句话将试图找到一些从左到右评估真实情况的东西。当它找到那个东西时,它会将它用作赋值的值。在这种情况下,如果getDataSource未定义,则会将其评估为false,并检查getStoregetStore存在,因此它将评估为(大致)为true,因此函数引用将分配给this.grid.getDataSource.getDataSource;

答案 1 :(得分:0)

如果您确定getDataSource()不会抛出异常,您可以尝试

this.grid.getDataSource.getDataSource = function(){
    try {
       return this.getDataSource();
    }
    catch(ex) {
       return this.getStore();
    }
};

或者你可以改变

 if (typeof this.getDataSource == "undefined")

if (typeof this.getDataSource != "function")

更新: 这有用吗?:

this.grid.getDataSource = function(){
    if (typeof this.getDataSource != "function")
        return this.getStore();
    else 
        return this.getDataSource();
}