Переопределение метода Javascript, только если он не существует - PullRequest
0 голосов
/ 25 августа 2010

Моя цель здесь - переопределить метод, если он не найден, в противном случае использовать оригинальный метод (для обратной совместимости библиотеки я не могу изменить).

Это то, что я имею до сих пор, но все еще борюсь с:

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 ]

1 голос
/ 25 августа 2010

я думаю, что это должно делать то, что вы хотите.

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

это утверждение попытается найти что-то, что оценивает истину слева направо.когда он находит эту вещь, он будет использовать ее в качестве значения для назначения.в этом случае, если getDataSource не определено, оно будет оценено как ложное, и getStore будет проверено.getStore существует, поэтому он будет оцениваться как (приблизительно) true, и поэтому ссылка на функцию будет присвоена this.grid.getDataSource.getDataSource;

0 голосов
/ 25 августа 2010

Если вы уверены, что 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")

UPDATE: Это работает?:

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