JS'de "alma" kalıtımını denemeye çalışıyorum. Sadece temelde başka bir bir nesneden tüm özelliklerini kopyalamak için düzgün bir yol keşfetti:Kalıtım: this.base = Class(); this.base() veya ...?
function Person(name){
this.name="Mr or Miss: "+name;
this.introduce = function(){
console.log("Hi, I am "+this.name);
}
}
function Employee(name,title){
this.title=title;
this.base=Person;
this.base(name);
}
e = new Employee('tony', 'manager')
e.introduce();
Not Bir kurucu ile Kişi() sınıf var ve bunun niteliği "ad" yapıcı tarafından oluşturulur. Bununla ilgili en önemli şey, aynı zamanda çalışanın ALSO adını yapıcıya (ve voila'ya) sahip olmasıdır, aynı parametreyi kullanarak Kişi nesnesini oluşturur. şimdi ne ....
function Person(name){
this.introduce = function(){
console.log("Hi, I am "+this.name);
}
}
function Employee(name, title){
this.name = name; /* ?!?!?!?!? I can't call the proper constructor here */
this.title = title;
}
Employee.prototype= new Person(); /* ?!?!? NO NAME HERE..>? */
Employee.prototype.constructor = Employee;
e = new Employee('tony', 'manager')
e.introduce();
Err:
ben "Prototip" yolu ile bu yapmış olsaydı? Bunu bile tamamlayamıyorum: Çalışandaki this.name, uygun Kişi yapıcısı kullanılarak ayarlanamaz; Bir Şahıs nesnesinin yaratılması mirasta sadece bir kez olur.
Öyleyse neyi özlüyorum? İlk örneğim davamda gitme yolunu mu? İkinci örnekle aynı sonucu elde etmenin bir yolu var mı?
Yardım!
function Parent() {}
function Child() {
Parent.call(this); // call the constructor of the parent
}
var Constr = function() {};
Constr.prototype = Parent.prototype;
Child.prototype = new Constr();
Child.prototype.constructor = Child;
Yani "hile" boş işleve prototip olarak Parent.prototype
atamak ve Child
prototipi olarak bu işlevin yeni bir örneğini oluşturmaktır:
Ben bu yanıt için ne kadar minnettar ifade edemez ... – Merc
Tamamen (D vay, yere almak gerekir) Google Kapatma kitaplığında fonksiyonlarını anlamak! Anladığım kadarıyla, türetilmiş bir sınıf oluşturduğumda, iç öznitelikleri mi yoksa Parent.call (this) yazarak yazmak istemiyorum; veya Parent.call (bu, isim) - bu doğru mu? Bunu yapmak istiyorsan, her zaman yapmak istemez miydin? – Merc
@Tony: Bence yaparsın. Ama eğer klasik kalıtım göz önüne alındığında (Java gibi), eğer bunun üzerine yazarsanız ebeveynin yapıcısını da çağırmalısınız.Tek fark şudur: JavaScript'te temelde * her zaman * kurucunun üzerine yazmalısınız çünkü sınıfları nasıl simüle ediyoruz. Yani aslında o kadar farklı değil ve belki de neler olduğunu anlamak daha da kolay. –