JavaScript değil
Yani, Şimdi
PersonProto = { // the "class", or prototype
fname: "thisfname"
};
function Person() { // the constructor function
this.instanceVar = 'foo';
}
böyle bir şey yapmak prototip yapıcı bağlamak isteyebilirsiniz Başkalarının söyledikleri gibi dersler var. Kalıtım, özünde, yeni oluşturulmuş bir nesne üzerinde silinemez özellik referansları oluşturmaktan başka bir şey yapmayan prototip ile çözülür. JavaScript'in basit veri nesneleri için alternatifleri vardır, yani nesne değişmezleri.
JavaScript'teki 'Sınıf' değişimi gibi tanımlanmalıdır:
// I use function statements over variable declaration
// when a constructor is involved.
function Person(name) {
this.name = name;
}
// All instances of Person create reference methods to it's prototype.
// These references are not deletable (but they can be overwritten).
Person.prototype = {
speak: function(){
alert(this.name + ' says: "Hello world!"');
}
};
var Mary = new Person('Mary');
Mary.speak(); // alerts 'Mary says: "Hello world!"'
this
referans, function
sahibine işaret etmektedir. Person
'u new
numaralı operatör olmadan çağırırsanız, sahip, genel kapsam (pencere) olacaktır. Örneğinize özellik atamak için bu başvuruyu kullanmazsanız, özellikler yalnızca değişkenler olarak bildirilir. var
bildirimini kullanmazsanız, o zaman bu beyanlar kötü olan global değişkenler yaratacaktır! Geçerli örneğine özelliklerini eklemek istiyorsanız bir yapıcı işlevi this
referans kullanarak bu
hakkında
daha son derece önemlidir. this
kullanmadan, yalnızca bir değişken (bir özellik ile aynı değildir) ve belirtildiği gibi, var deyimini kullanmazsanız, global değişkenler yaratırsınız.
function Person(){
name = 'Mary'
}
var p = new Person();
alert(p.name); // undefined, did not use 'this' to assign it to the instance.
alert(name); // 'Mary', boo, it created a global variable!
Bunu kullanın! Eğer prototip atamak ve bir konutunuz yapmak için fonksiyon yapıcı tekrar üzerine yazmak sürece
function Person(){
this.name = 'Mary'
}
var p = new Person();
alert(p.name); // 'Mary', yay!
alert(name); // undefined, yay!
Not fonksiyon yapıcı aracılığıyla bir örneğe atanan şey miras olamaz.
Oluşturucu olarak iki katına çıkarılmış bir işlev aracılığıyla yeni bir örnek oluşturduğunuzda, aslında aşağıdakiler gerçekleşir.
pseudo code:
copy Person.prototype as person
invoke Person function on person
return person
Aslında, bir sınıf örneğini oluşturduğunuzda her klasik dilde olan budur. Ancak, JavaScript'teki ana fark, güzel bir Sınıf ifadesinde kapsüllenmemesidir. Başlangıçta JavaScript bile işlev yapıcılara sahip değildi, ancak daha sonra da eklenmişti çünkü SUN, JavaScript'in daha çok Java gibi olmasını istediler.
nesne değişmezleri
sadece iç veri taşıyan ve herhangi bir yöntem nesne değişmezdir nesneler için işlev kurucular alternatif.
maharetlerini nesne değişmezleri ile // do not ever do this!
var Mary = new Object();
Mary.firstName = 'Mary';
Mary.lastName = 'Littlelamb';
, sen hangi module pattern (kullanarak iç veri nesneleri için bir fabrika deseni oluşturabilir: ziyade iç nesneleri bildirmek tercih yoludur
var Mary = {
firstName: 'Mary',
lastName: 'Littlelamb'
};
genellikle singletons için).
var createPerson = function(firstName, lastName){
return {
firstName: firstName,
lastName: lastName
}
}
var Mary = createPerson('Mary', 'Littlelamb');
Bu, rahat bir kapsülleme sağlar, ancak yalnızca iç veri nesneleri için kullanılabilir.
Nesne hazırlıkları ve JavaScript ile yapabileceğiniz başka bir şey de tercih edilmesi gereken temsilci seçilmesidir.
var personMethods = {
speak: function(){
alert(this.firstName + ' says: "Hello world!"');
}
};
var Mary = {
firstName: "Mary",
lastName: "Littlelamb"
};
var Peter = {
firstName: "Peter",
lastName: "Crieswolf"
};
personMethods.speak.apply(Mary); // alerts 'Mary says: "Hello world!"'
personMethods.speak.apply(Peter); // alerts 'Peter says: "Hello world!"'
Neden bu tercih edilmeli?Nesnelerinizi dakika ve okunabilir tuttuğu için, prototipik referanslar bile belleğe girer ve kalıtım ve 'alt sınıflama' kullanırken çok fazla kullanılmayan yöntem referansı olan çocuk örnekleriyle sonuçlanırsınız. Temsil her zaman daha iyidir.
Neden downvote? –
'Person' bir sınıf değil, JavaScript’te sınıf gibi bir şey yok. JavaScript 'prototypal devralma' ile nesneleri vardır, ancak 'Kişi' sadece bu durumda bir Nesne, hatta bir HashMap/Sözlük olarak adlandırılan bir yöntem bile yoktur. Bazı iyi açıklamalar için aşağıdaki BGerissen yanıtına bakınız. –
@Ivo Genel olarak konuşulduğunda bir sınıf olarak düşünülmelidir. Ve hayır, “Kişi”, daha spesifik olmak istiyorsanız, “nesneyi başlatmak için kullanılan bir işlev” dir. Yine, genel olarak konuştuğumuzda onu bir sınıf olarak adlandırabileceğimize inanıyorum, her zamankinden daha spesifik olmaya devam edebilirsiniz ve buna son veriniz ** ECMA Komut Dosyası İşaretçisi (1) parantez üzerinden çağrılarak (1) ayrıştırılacak bir senaryoya sözdizimi. (1): Yeni javascript derleyicileri durumunda yürütülür. **. Öyleyse, sorunun cevabı, terminolojiyi yanlış yönlendirmek ve yanlış kullanmak değil, bir şeyi basit bir şekilde açıklamaktır. – aularon