2009-06-30 15 views
19

przeżywa dokumentacji javascript, znalazłem następujące dwie funkcje na javascript obiekt wygląda interesująco:Listener mienia zmiany wartości w JavaScript Object

.watch - Zegary właściwością być przypisana wartość i uruchamia funkcję, gdy to się zdarza.
.unwatch - Usuwa zestaw watchpointów za pomocą metody watch.

wykorzystanie próbki:

o = { p: 1 }; 
o.watch("p", function (id,oldval,newval) { 
    console.log("o." + id + " changed from " + oldval + " to " + newval) 
    return newval; 
}); 

Kiedykolwiek zmienić wartość właściwości "p", funkcja ta zostanie uruchomiony.

o.p = 2; //logs: "o.p changed from 1 to 2" 

pracuję nad javascript dla szybkich kilku lat i nigdy nie stosować tych funkcji.
Czy ktoś może podać kilka przydatnych przypadków, w których te funkcje będą przydatne?

+2

te są dostępne tylko dla przeglądarek opartych na Gecko, jak Mozilla Firefox. Internet Explorer obnaża podobną metodę na obiektach, zwaną onpropertychange. –

Odpowiedz

8

Zegarek jest przeznaczony do sprawdzania poprawności wartości właściwości. Na przykład można potwierdzić, że coś jest liczbą całkowitą:

obj.watch('count', function(id, oldval, newval) { 
    var val = parseInt(newval, 10); 
    if(isNaN(val)) return oldval; 
    return val; 
}); 

Można go używać do sprawdzania poprawności długość naciągu:

obj.watch('name', function(id, oldval, newval) { 
    return newval.substr(0, 20); 
}); 

Jednak te są dostępne tylko w najnowszych wersjach SpiderMonkey javascript silnik . Świetnie, jeśli używasz Jaxer lub osadzasz silnik SpiderMonkey, ale nie jest on jeszcze dostępny w Twojej przeglądarce (chyba, że ​​używasz FF3).

+1

Heads up, teraz dostępny we wszystkich nowoczesnych przeglądarkach. Sugestia: Zamiast tego użyj gettera i setera. –

1

Możesz zajrzeć do biblioteki Javascript Propery Events. Jest to niewielka biblioteka z kilkoma wydaniami, które ostatnio stworzyłem. Dodaje kilka właściwości: on[event], które mogą być używane, podobnie jak właściwości obiektów HTML w postaci on[event]. Ma również prostą kontrolę typu, która wywołuje zdarzenie onerror, jeśli się nie powiedzie.

Biorąc kodu spowodowałoby to mniej więcej tak:

var o = {} 
Object.defineProperty(o, "p", { 
    value:1, 
    writable:true, 
    onchange:function(e){ 
     console.log("o." + e.target + " changed from " + e.previousValue + " to " + e.returnValue); 
    } 
}) 
Powiązane problemy