2012-05-10 1 views
0

Могу ли я отступить к другому методу, если метод данного объекта не найден?автозагрузка другого метода, если метод не определен в javascript

говорят, что у меня нет (просто, чтобы получить представление)

var phoneCall new function() { 

    function toMom() { 

    } 

    function catchAll() { 

    } 

} 

q = new phoneCall; 
q.toMom(); 

q.toDad() //should fire phoneCall.catchAll(); 

ответ

0

Нет - не в кросс-браузерной образом. У Firefox и еще нескольких двигателей есть подход, чтобы сделать это, но он не будет работать в Chrome, IE и т. Д. Proxies в конечном итоге позволит некоторые функции, подобные этому, но это все еще находится на ранней стадии принятия двигателя.


Edit: вот код, который может вам начать с чем-то, что будет работать, хотя:

var phoneCall = { 
    to: function(whom) { 
     (phoneCall.people[whom] || phoneCall.catchAll)(); 
    }, 
    people: { 
     mom: function() { 
      // call mom functionality 
     } 
    }, 
    catchAll: function() { 
     // generic call functionality 
    } 
}; 


phoneCall.to('mom'); 
phoneCall.to('dad'); // invokes catchAll 
+0

спасибо, но это фактически означает выполнение функции с переключателем в ней и по умолчанию, а не с отображением, которое я хотел. :) спасибо в любом случае –

+1

Я, я понял, что это не совсем то, что вы делали. Реальный ответ на вопрос был «Нет» ... остальное было просто потенциальной работой :). В JavaScript ближе всего вы найдете https://developer.mozilla.org/en/JavaScript/Reference/Global_Objects/Object/NoSuchMethod, но, как указано выше, это работает только в FF. – jmar777

0

Вы могли бы сделать что-то вроде этого:

q.toDad() || q.catchAll(); 

EDIT:

Пользователь jmar77 является право на этот код является недопустимым, поскольку он возвращает результат функции, а не сама функция ... Мой плохой. Вот обновленный код:

function phoneCall() { 
    this.toMom = function() { 
     console.log('Mom was called.'); 
    } 
    this.catchAll = function() { 
     console.log('Catch all was called'); 
    } 
} 

q = new phoneCall(); 
q.toMom(); 
q.toDad ? q.toDad() : q.catchAll();​ 

http://jsfiddle.net/remibreton/yzDh7/

+1

Это приведет к ошибке. Вы могли бы, однако, сделать что-то вроде 'q.toDad? q.toDad(): q.catchAll() '. Но я не думаю, что это то, что ищет OP. – jmar777

+0

Спасибо jmar77, вы правы. То, как я понимаю, что OP хочет делать, я думаю, что это единственный путь. Я все еще думаю, что это правильное решение, не так ли? –

+0

Я думаю, что это возможное решение, но оно ставит бремя проверки кода, потребляющего «phoneCall», а не интернализации этой логики. Я сделал удар в чем-то близком к тому, что он описал, но я думаю, что он действительно хочет что-то вроде, например, Ruby's missing_method. – jmar777

0

Использование геттер картина:

http://jsfiddle.net/XjgPW/1/

var myObject = (function() { 
    var methods = { 
     method1: function() { 
      console.log('method1 called'); 
     }, 
     method2: function() { 
      console.log('method2 called'); 
     }, 
     defaultMethod: function() { 
      console.log('defaultMethod called'); 
     } 
    }; 

    var get = function (name) { 
     if (methods.hasOwnProperty(name)) { 
      return methods[name]; 
     } else { 
      return methods.defaultMethod; 
     } 
    }; 

    return { 
     get: get 
    }; 
}()); 
+0

Эй, спасибо за ваш подход, но на самом деле вы можете выполнить то же самое с функцией с переключателем в ней и по умолчанию, важно то, как вы это называете. MyObject.get ('method2')(); то, что я хотел бы, myobject.someMethodMissing() отображает myobject.catchAll(); спасибо за ваше время в любом случае, ура :) –

0

Следующий код демонстрирует вызов метода запасной, если первый метод не существует :

q = {}; 
q.toDad = function() { 
    console.log("to dad"); 
} 
(q.toMom || q.toDad)(); // Will output "to dad" to the console 

q.toMom = function() { 
    console.log("to mom"); 
} 
(q.toMom || q.toDad)(); // Will output "to mom" to the console 

 Смежные вопросы

  • Нет связанных вопросов^_^