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
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:
- Temiz, boş bir nesne örneği.
- Taze nesnenin iç prototip Araba ayarlanır.
- Bu Süper işlevi ishal yapıcı.
- 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.
JavaScript Miras...
JavaScript iyi bir Örnek'In Proto...
Nasıl (açık) reset, JavaScript ile for...
Neden JavaScript iki farklı sayılar eş...
ECMA:JavaScript derleyici / ES6 Uyum...