2013-02-20 17 views
5

W przypadku projektu, nad którym obecnie pracuję w języku JavaScript, używam formatów dziesiętnych, więc łatwiej jest obliczyć zamiast używać formatu godziny/minuty w ciągach (kalendarz powiązany projekt). Aby wyświetlić czas na ekranie użytkownika, kod czasowy musi być pokazywany jako hh: mm.Funkcja prototypowania języka JavaScript: dziesiętna wartość czasu na łańcuch czasu

Pomyślałem, że byłoby wspaniale, aby korzystać z funkcji tego prototypu String gdyż pozwala mi użyć kodu jak:

var time = 8.75; 
document.write("Meeting at "+time.toTime()); // writes: Meeting at 8:45 

tej pory mam, że prawie pracy, przy użyciu:

String.prototype.toTime = function(){ 
    var hrs = this.toString().slice(0,this.indexOf(".")); 
    var min = Math.round(this.toString().slice(this.indexOf("."))/100*60); 
    min = min<10 ? "0"+min : min.toString(); 
    return hrs+":"+min; 
} 

Problem polega jednak na tym, że działa to tylko wtedy, gdy zmienna time jest łańcuchem. W przeciwnym razie pojawi się niezdefiniowany błąd.

Czy istnieje jakikolwiek sposób zastosowania prototypu do innego obiektu w JavaScript, więc nie muszę używać time.toString().toTime()?

Dzięki!

+0

Czy 'Number.prototype.toTime' pomóc? I możesz stenografować do '(" + time) .toTime() 'w twoim aktualnym kodzie. – Passerby

+0

możesz użyć 'Object.prototype', ponieważ wszystkie obiekty dziedziczą z niego. – TheBronx

+0

Osobiście uważam, że jest to czystsze podejście do przekazywania wartości funkcji zamiast przedłużania prototypu. –

Odpowiedz

5

Po pierwsze, można dodać do prototypu Number. Wiele osób będzie ostrzegać przed modyfikowaniem prototypów, co w wielu przypadkach jest uzasadnione. Jeśli istnieje szansa, że ​​skrypty stron trzecich będą działać razem z Twoimi, istnieje niebezpieczeństwo modyfikacji prototypów.

drugie, uproszczony kod trochę, wykorzystując moduł i podłogę, aby obliczyć godziny i minut ...

Number.prototype.toTime = function(){ 
    var hrs = Math.floor(this) 
    var min = Math.round(this%1*60) 
    min = min<10 ? "0"+min : min.toString(); 
    return hrs+":"+min; 
} 

var time = 8.25; 
console.log("Meeting at "+time.toTime()); 
+0

Nie musisz 'toString(). Split (". ")' Jeśli już manipulujesz liczbą ... 'parseInt',' Math.floor', etc. może załatwić sprawę. – Passerby

+0

@Passerby masz rację ... Poprawiłem odpowiedź odpowiednio –

+0

Dzięki, to ma sens. Jednakże znalazłem tam jeden mały błąd: '9.50' będzie wyprowadzane jako" 9:03 "zamiast" 9:30 ". Dowolny pomysł? – Oscar

-1

Można użyć Object.prototype.toTime.

+0

Dlaczego negujesz? Pomoże ci, jeśli użyjesz 'prototypu' obiektu 'Object' –

+0

1. ponieważ dodanie do' Object.prototype' jest niebezpieczne, chyba że wiesz _exactly_ co robisz 2. Ponieważ wtedy odnosi się do każdego 'obiektu', nawet tam, gdzie ta metoda nie ma sensu. – Alnitak

+0

Tak, wiem to, ale coś negatywnego oznacza "szaloną złą odpowiedź". To rozwiązanie odnosi się do twojego przypadku, ale nie jest najlepszym rozwiązaniem, jeśli chodzi o domniemane niebezpieczeństwo. Więc nie sądzę, że zasługuje na negatywne: D –

Powiązane problemy