2013-08-28 13 views
5

Jestem pewien, że to definitywnie zostało odebrane przed, i starałem się go szukać .. może moje warunki wyszukiwania są błędne ...dowolnych metod i właściwości obiektów w JavaScript

Zasadniczo mam obiektu myObject, i mam zestaw określonych właściwości i metod dla niego. Chcę tylko obsłużyć wywołania/odwołania do właściwości i metod, które nie zostały zdefiniowane.

Na przykład, powiedzmy, że mam to:

var myObject = { 
    someProperty : 'foobar', 
    someFunction : function() { /* Do stuff */ } 
} 

Obecnie, jeśli ktoś próbuje nawiązać połączenie z myObject.someOtherFunction(), JavaScript wrzeszczy i krzyczy o tym. Chcę tylko skonfigurować sposób automatycznego obsługiwania tego. Na przykład, zamiast JavaScript rzucając błąd, mój obiekt po prostu zwraca false. czy to możliwe?

Innym sposobem na to patrzeć to:

var myObject = { 
    someFunction : function() { /* Do stuff */ } 
    magicBucket : function() { /* Do stuff */ } 
} 

Jeśli zadzwonię myObject.someFunction(), dobrze, że jest zdefiniowany i coś robi. To, co chcę zrobić, to na przykład zadzwonić pod numer myObject.someOtherFunction(), zamiast JavaScript rzucając błąd, zadzwoni on pod numer myObject.magicBucket().

Powodem jest to, że mam klienta, który korzysta z biblioteki strony trzeciej w swojej witrynie. Chcą zaprzestać używania go, ale całkowite usunięcie go zajmie dużo czasu i wysiłku. Tak więc, jako rozwiązanie krótkoterminowe, chcieli wiedzieć, czy mogę stworzyć plik dummy, który w zasadzie nic nie robi. Ta biblioteka używa kilku obiektów, które mają wiele metod. Mógłbym przejrzeć wszystko i zrobić obojętne obiekty, ale pomyślałem, że może być pewna łatwa metoda "catch-all", aby to zrobić.

Niektórzy wspomnieli, że sprawdzają, czy metoda istnieje najpierw, zawijając ją w warunek lub próbując ... catch itd. Chodzi o to, że w tej chwili nie mogę dotknąć faktycznych wywołań metod. A ponieważ ogólnym celem jest ostateczne całkowite usunięcie kodu, nie ma to nawet zastosowania.

+0

Jest to dość nieregularny, mogę zapytać, dlaczego chcesz tę funkcję? – azz

+1

Jeśli myślisz, że 'someOtherFunction' będzie albo' niezdefiniowanym' lub funkcją, możesz wykonać 'myObject.someOtherFunction? MyObject.someOtherFunction(): false', więc wywołujesz tylko' myObject.someOtherFunction' jeśli nie jest to "falsy" "value (' false' 'undefined',' null', '0'), lub wydaj 'false' jako wartość zastępczą. – apsillers

+1

http://stackoverflow.com/questions/2527474/is-there-a-way-to-handle-unefined-functions-being-called-in-javascript –

Odpowiedz

2

Nie, nie możesz mieć dowolnych pobierających w JavaScript. Można sprawdzić, czy funkcja istnieje przed nazywając ją, aby zapobiec błąd mimo:

if (myObject.someOtherFunction) 
    myObject.someOtherFunction(); 

albo lepiej, jeśli nie wiesz, że to niekoniecznie funkcją:

if (typeof myObject.someOtherFunction == 'function') 
    myObject.someOtherFunction(); 
+0

Tak, to nie jest opcja, zobacz moje edycje :( – slinkhi

+0

Możesz mieć gdzie serwery proxy są obsługiwane ... – Bergi

+0

@Bergi To prawda, ale to prawdopodobnie nie pomoże w sytuacji PO. – Paulpro

0

Można by stworzyć funkcja otoki tak:

function callFunction(fn, args) { 
    var funct = this[fn]; 
    return (typeof funct == "function") 
     ? funct.apply(this, args) 
     : false; 
} 

I zadzwonić z:

callFunction("blah", [1, 2, 3]); 
>>> false 

Przykład:

this.foo = function(a, b) { 
    console.log(a); 
    return b; 
} 
callFunction("foo", [1, 2, 3]); 
>>> 1 
>>> 2 # return value 
3

Istnieje specjalna właściwość o nazwie __noSuchMethod__ który robi dokładnie to, co właśnie opisano. Jednak jest to niestandardowa właściwość. Działa tylko w Firefoksie. Oto jak z niego korzystać:

var o = { 
    __noSuchMethod__: function (name, args) { 
     alert(name); // prints the name of the method 
     alert(args); // prints the array of arguments 
    } 
}; 

o.abc(1, 2, 3); // OUTPUT: abc 1,2,3 

Przyszłość to jednak proxy objects.Poniżej znajduje się krótki tutorial proxy: Proxy Tutorial

+0

tak, to jest dokładnie to, czego potrzebuję, z tym wyjątkiem, że musi działać we wszystkich przeglądarkach:/+1 za to, że jest na dobrej drodze. – slinkhi

+0

Dziękuję za właściwe ustawienie. Od tego posta zmieniła się składnia Proxy, więc przykład nie działa. MDN ma aktualny przykład: https://developer.mozilla.org/en/docs/Web/JavaScript/Reference/Global_Objects/Proxy –

0

Aktualizacja na proxy, tutaj jest nieskończona tablica:

$ var squares = new Proxy([], {get:(target,key) => key*key}); 
$ squares[2] 
4 
$ Array.isArray(squares) 
true 
Unfortunately: 
$ squares.length 
NaN // Want Infinity. 

I obojętne obiektu:

$ x = new Proxy({}, {get:(target,key) => console.error("The computer says no", key)}) 
$ x.laugh 
The computer says no laugh 

Ten ostatni pomogłoby OP zrobić obojętny obiekt, chociaż trzeba by trochę czarnej magii, aby odgadnąć, który manekin powinien powrócić.

up-to data odniesienia: https://developer.mozilla.org/en/docs/Web/JavaScript/Reference/Global_Objects/Proxy

Powiązane problemy