SORU
8 EKİM 2008, ÇARŞAMBA


Bir JavaScript başlatmasını prototip çağırarak nesne.kurucu.Uygula

Benim yapmaya çalıştığım şey belirli bir örnek ile başlayalım.

Formu [ 2008, 10, 8, 00, 16, 34, 254 ] yıl, ay, Gün, Saat, Dakika, Saniye ve milisaniye bileşenleri bir dizi var. Tarih nesnesi aşağıdaki standart oluşturucu kullanarak oluşturmak istiyorum

new Date(year, month, date [, hour, minute, second, millisecond ])

Nasıl bu kurucu benim dizisi yeni bir Tarih almak için pass örneği alabilir miyim?[GüncellemeSoru : sorum aslında bu spesifik bir örnek olmanın çok daha ötesinde. Yerleşik Tarih gibi JavaScript dersleri, Dizi, RegExp, vb için genel bir çözüm istiyorum. benim sınırlarımın ötesinde olan. ]

Aşağıdaki gibi bir şey yapmaya çalışıyorum:

var comps = [ 2008, 10, 8, 00, 16, 34, 254 ];
var d = Date.prototype.constructor.apply(this, comps);

Ben "new" bir yerde. orada muhtemelen gerek Yukarıda sadece eğer arasaydım olarak geçerli saati döndürür "(new Date()).toString()". Ben de tamamen yukarıda:) yanlış yönde olabilirim kabul ediyorum

Not: eval() ve dizide erişen kimse, lütfen. bir öğe Gibi dizi kullanmak gerekir eminim.

< / ^ hr .

Güncelleme: Başka Deneyler

Kimse çalışan bir cevap bulamamış henüz bu yana, daha fazla oyun etrafında yaptım. İşte yeni bir keşif.

Kendi sınıfı ile bunu yapabilirim:

function Foo(a, b) {
    this.a = a;
    this.b = b;

    this.toString = function () {
    	return this.a   this.b;
    };
}

var foo = new Foo(1, 2);
Foo.prototype.constructor.apply(foo, [4, 8]);
document.write(foo); // Returns 12 -- yay!

Ama içsel Tarih sınıfı ile çalışmıyor:

var d = new Date();
Date.prototype.constructor.call(d, 1000);
document.write(d); // Still returns current time :(

Ne bu Sayı ile çalışır:

var n = new Number(42);
Number.prototype.constructor.call(n, 666);
document.write(n); // Returns 42

Belki de bu sadece iç nesneleri ile mümkün değil mi? Firefox BTW ile test ediyorum.

CEVAP
19 EKİM 2008, Pazar


Benim de daha fazla araştırma yaptım ve sonuç ile geldibu imkansız bir featTarih sınıfı nasıl uygulanır dolayı.

SpiderMonkey kaynak Tarih nasıl uygulandığını görmek için kodu kontrol ettim. Aşağıdaki birkaç satır aşağı kaynar düşünüyorum

static JSBool
Date(JSContext *cx, JSObject *obj, uintN argc, jsval *argv, jsval *rval)
{
    jsdouble *date;
    JSString *str;
    jsdouble d;

    /* Date called as function. */
    if (!(cx->fp->flags & JSFRAME_CONSTRUCTING)) {
        int64 us, ms, us2ms;
        jsdouble msec_time;

        /* NSPR 2.0 docs say 'We do not support PRMJ_NowMS and PRMJ_NowS',
         * so compute ms from PRMJ_Now.
         */
        us = PRMJ_Now();
        JSLL_UI2L(us2ms, PRMJ_USEC_PER_MSEC);
        JSLL_DIV(ms, us, us2ms);
        JSLL_L2D(msec_time, ms);

        return date_format(cx, msec_time, FORMATSPEC_FULL, rval);
    }

    /* Date called as constructor. */
    // ... (from here on it checks the arg count to decide how to create the date)

Ne zaman Tarih olarak kullanılır fonksiyon (Date() Date.prototype.constructor(), hangi tam olarak aynı şey), ayarlarına dönen şimdiki zaman gibi bir dize yerel biçim. Bu iletilen tüm argümanların ne olursa olsun

alert(Date()); // Returns "Thu Oct 09 2008 23:15:54 ..."
alert(typeof Date()); // Returns "string"

alert(Date(42)); // Same thing, "Thu Oct 09 2008 23:15:54 ..."
alert(Date(2008, 10, 10)); // Ditto
alert(Date(null)); // Just doesn't care

JS düzeyinde bunu aşmak için yapılabilecek bir şey olduğunu sanmıyorum. Ve bu muhtemelen bu konuda benim takip ettiğim kadar.

Ayrıca çok ilginç bir şey fark ettim:

    /* Set the value of the Date.prototype date to NaN */
    proto_date = date_constructor(cx, proto);
    if (!proto_date)
        return NULL;
    *proto_date = *cx->runtime->jsNaN;

Date.prototype NaN ve bu nedenle iç değeri ile örnek bir tarihtir

alert(Date.prototype); // Always returns "Invalid Date"
                       // on Firefox, Opera, Safari, Chrome
                       // but not Internet Explorer

YANİ bize hayal kırıklığı yok. Olaylar biraz daha farklı ve muhtemelen -1 böylece Bugüne kadar iç değerini ayarlar.prototip her zaman epoch biraz önce bir tarih döndürür.

< / ^ hr .

Güncelleme

Son olarak ECMA-262 içine kazdım ve ben (Tarih nesnesi ile) tanımı -- -- başarmaya çalıştığım şey mümkün değil: döner

15.9.2 Tarih Kurucu bir İşlev olarak çağrıldı

Tarih olarak çağrıldığında bir kurucu olarak değil,işlev temsil eden bir dize döndürür geçerli saat (UTC).

NOTİşlevi Date(…) eşdeğer değildir çağrısı nesne oluşturma expression new Date(…) aynı argümanlar ile.

15.9.2.1 Tarih ( [[ay [, [Tarih, Saat [, Dakika [, Saniye [,yıl ms ] ] ] ] ] ] ] )

Tüm bağımsız değişkeni isteğe bağlıdır; herhangi bir bağımsız değişkendir sağlanan kabul edilir ama tamamen görmezden geldi. Bir dize oluşturulan ve bu gibi geri döndü ifade 29**.

Bunu Paylaş:
  • Google+
  • E-Posta
Etiketler:

YORUMLAR

SPONSOR VİDEO

Rastgele Yazarlar

  • Kyler Briskey

    Kyler Briske

    20 ŞUBAT 2011
  • Mark Brown

    Mark Brown

    9 HAZİRAN 2010
  • theatre2film

    theatre2film

    12 NİSAN 2006