SORU
21 Mayıs 2009, PERŞEMBE


Anlayış JavaScript miras ilk

JavaScript OOP için yeni duyuyorum. Aşağıdaki kod blokları arasındaki farkı açıklayabilir misin lütfen. Ben test edilmiş ve her iki blok iş. En iyi uygulama ve neden?

İlk blok:

function Car(name){
    this.Name = name;
}

Car.prototype.Drive = function(){
    document.write("My name is "   this.Name   " and I'm driving. <br />");
}

SuperCar.prototype = new Car();
SuperCar.prototype.constructor = SuperCar;

function SuperCar(name){
    Car.call(this, name);
}

SuperCar.prototype.Fly = function(){
    document.write("My name is "   this.Name   " and I'm flying! <br />");
}

var myCar = new Car("Car");
myCar.Drive();

var mySuperCar = new SuperCar("SuperCar");
mySuperCar.Drive();
mySuperCar.Fly();

İkinci blok:

function Car(name){
    this.Name = name;
    this.Drive = function(){ 
        document.write("My name is "   this.Name   " and I'm driving. <br />");
    }
}

SuperCar.prototype = new Car();

function SuperCar(name){
    Car.call(this, name);
    this.Fly = function(){
        document.write("My name is "   this.Name   " and I'm flying! <br />");
    }
}

var myCar = new Car("Car");
myCar.Drive();

var mySuperCar = new SuperCar("SuperCar");
mySuperCar.Drive();
mySuperCar.Fly();

Neden yazar Ekle Drive Fly yöntemlerle prototype ama yok ilan olarak this.Drive yöntemin Car sınıfı this.Fly SuperCar Sınıf?

Neden SuperCar.prototype.constructor SuperCar geri olması gerekiyor mu? Kurucu özelliği prototype ayarlandığında geçersiz kılınır? Bu satır ve hiçbir şey değişmedi yorumladı.

Neden SuperCar 19 *yapıcı diyorsun? Car özellikleri ve yöntemleri '' ben ne zaman . miras kalmayacak

var myCar = new Car("Car");

CEVAP
21 Mayıs 2009, PERŞEMBE


Norbert Hartl's answer, Süper eklenecek.prototip.kurucu gerekli değildir, ama bazı insanlar bir nesne (bu durumda Süper nesneleri) inşa işlevi almak için kullanışlı bir yol olarak kullanabilirsiniz.

Sadece ilk örnekte, Araba.Ara(bu, adı) bunu yaptığınızda, çünkü Süper yapıcı işlevi vardır:

var mySuperCar = new SuperCar("SuperCar");

Bu JavaScript ne yapar:

  1. Temiz, boş bir nesne örneği.
  2. Taze nesnenin iç prototip Araba ayarlanır.
  3. Bu Süper işlevi ishal yapıcı.
  4. Bitmiş nesne döndü ve mySuperCar yer almaktadır.

JavaScript için Araba aramadı nasıl dikkat edin. Prototip olarak, herhangi bir özelliği veya yöntemi Süper için kendinizi ayarlamanız yok olmanın Arabaya baktı. Bazen bu iyidir, örneğin Süper Sürücü bir yöntem yok, ama tüm Süper Sürücü aynı yöntemi kullanacak kadar Otomobilin bir payı olabilir. Diğer zamanlarda, her Süper kendi Adı olması gibi paylaşmak istemiyorum. Nasıl biri kendi için her şey Süper adını ayarlama hakkında gitmek? Bu ayarlayabilirsiniz.Bu Süper otomobil içinde adı yapıcı işlevi:

function SuperCar(name){
    this.Name = name;
}

Bu çalışır, ama bir saniye bekle. Tam olarak ne yaptığımızı Araba kurucu aynı şey mi? Kendimizi tekrar etmek istemiyorum. Araba zaten adını ayarlar bu yana, izin arayın.

function SuperCar(name){
    this = Car(name);
}

Hoppala, hiç this nesne özel referans değiştirmek istiyorum. 4 adımları hatırlıyor musun? O tutunacak bir tek yolu Süper nesne ve Araç arasındaki değerli iç prototip bağlantıyı korumak için, çünkü JavaScript verdiğin nesne. Ne Adını, taze Süper nesne bizim JavaScript atmadan olmadan kendimizi tekrar etmeden ve bize hazırlanmak için çok özel bir çaba harcadı mi göndereceğiz?

İki şey. Bir: this anlamı esnektir. İki: Araba bir fonksiyonudur. Olası Araba, Süper bir nesne yerine ile bozulmamış, taze örneği bir nesne ile değil, ama zor. Bu bize söz konusu: ilk örnek bir parçası olan nihai çözüm sağlar

function SuperCar(name){
    Car.call(this, name);
}

Bir fonksiyonu olarak, Araç işlevi kuruyoruz Süper örneğine Araba içinde this anlamını değiştirir call method, çağrılması için izin verilir. Presto! Şimdi her Süper kendi Name özelliği alır.

, Car.call(this, name) Süper kurucu sarmak için her yeni Süper kendine has özelliği, ama zaten arabada bu kodu çoğaltarak olmadan nesne verir.

Prototip onları anlamak sonra da korkunç değil, ama klasik sınıf/inheritence OOP modeli gibi hiç de fazla değil. the prototypes concept in JavaScript hakkında bir yazı yazmıştım. JavaScript kullanan bir oyun motoru için yazılmış, ancak ilgili olmalıdır, böylece aynı JavaScript motoru Firefox tarafından kullanılıyor. Bu yardımcı olur umarım.

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

YORUMLAR

SPONSOR VİDEO

Rastgele Yazarlar

  • Jonathan D.

    Jonathan D.

    3 Kasım 2006
  • pain975

    pain975

    27 NİSAN 2008
  • Slave Boy Films - Fandom from a Galaxy Far Far Away

    Slave Boy Fi

    12 HAZİRAN 2009