2013-02-20 16 views
5

Şu an üzerinde çalışmakta olduğum bir projede, ondalık biçemler kullanıyorum, bu yüzden dizeleri bir saat/dakika biçimi kullanmak yerine hesaplaması daha kolay (takvim) ilgili proje). Kullanıcı ekranındaki zamanı görüntülemek için, zaman kodu ss: dm olarak gösterilmelidir.Javascript prototype işlevi: bir zaman dizgesine ondalık zaman değeri

bu beni gibi kod kullanmasına izin vereceğini olarak bunun için bir dize prototip işlevini kullanmak için harika olacağını düşündüm:

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

Şimdiye kadar, bunu var neredeyse kullanarak, çalışma:

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; 
} 

Sorun, ancak bu, yalnızca time değişkeninin bir dizgeyse çalışacağıdır. Aksi halde tanımlanmamış bir hata verecektir.

Prototip'i JavaScript'te farklı bir nesneye uygulamanın herhangi bir yolu var mı? Böylece time.toString().toTime()'u kullanmak zorunda kalmam?

Teşekkürler!

+0

'yardımcı Number.prototype.toTime' misiniz kodunuzu basitleştirilmiş? Ve mevcut kodunuzda '(" "+ time) .toTime()' e kısayol olabilirsiniz. – Passerby

+0

'Object.prototype', tüm nesnelerden devraldığı gibi kullanabilirsiniz. – TheBronx

+0

Şahsen, prototipi genişletmek yerine değeri bir işleve iletmek için daha temiz bir yaklaşım olduğunu düşünüyorum. –

cevap

5

İlk olarak, Number prototipini ekleyebilirsiniz. Birçok kişi, çoğu durumda haklı olan prototiplerin değiştirilmesine karşı uyarıda bulunacaktır. Şansınız varsa 3. taraf betikleri sizin yanınızda çalışacaktır, prototipleri değiştirmek tehlikelidir.

İkincisi, biraz, modülü, ve saat ve dakika hesaplamak için zemin ... kullanarak

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

"toString(). Bölünmesine (". ") Gerek yoktur. Eğer zaten sayıları değiştiriyorsanız ...' parseInt', 'Math.floor', vb. hile yapabilir. – Passerby

+0

@Passerby oldukça haklısınız ... Cevabını buna göre ayarladım –

+0

Teşekkürler, bu da mantıklı. Ancak, orada bir küçük böcek buldum: "9.50", "9:30" yerine "9:03" olarak çıkacak. Herhangi bir fikir? – Oscar

-1

Object.prototype.toTime'u kullanabilirsiniz.

+0

Neden negativasyon yapıyorsunuz? Nesne –

+0

1'in "prototipini" kullanırsanız, size yardımcı olacaktır. Çünkü "Object.prototype" öğesine eklemek, _exactly_ yaptığınızı bilmediğiniz sürece tehlikelidir 2. Çünkü her nesne için geçerli olur. Bu yöntemin hiçbir anlam ifade etmediği yerler. – Alnitak

+0

Evet, biliyorum, ama bir şeyi olumsuzlamak, "çılgın bir yanlış cevap" anlamına geliyor. Buradaki çözüm sizin durumunuz için geçerlidir, ancak en büyük tehlike unsuru değildir. Bu yüzden hak etmediğini düşünmüyorum: D –

İlgili konular