2010-09-04 36 views
21

Javascript'te sınıf değişkenlerini nasıl bildiririm?sınıf değişkeni

function Person(){ 
    fname = "thisfname"; //What needs to be put here 
} 
alert(Person.fname) //It should alert "thisFrame" 

Bu yaklaşımı kullanmak istemiyorum.

function Person(){ 

} 
Person.fname = "thisfname"; 
alert(Person.fname) //alerts "thisframe" 

cevap

9

Eğer bahsedilen şekilde (function Person içinde), başka bir şekilde sınıf değişkeni tanımlamak için nasıl örnek özelliklerini tanımlamaktır.

function Person(name){ 
    this.name = name; 
} 
Person.specie = "Human"; 

alert(Person.specie) //alerts "Human", a class variable. 

var john = new Person('John'); 
alert(john.name); //alerts "John", an object property. 
+0

Neden downvote? –

+0

'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. –

+5

@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

0
function Person(){ 
    this.fname = null; 
    this.lname = null; 
    this.set_fname = set_fname; 
    this.set_lname = set_lname; 
    this.get_name = get_name; 
} 
/* Another way 
function Person(fname, lname){ 
    this.fname = fname; 
    this.lname = lname; 
    this.get_name = get_name; 
}*/ 
function set_fname(fname){ 
    this.fname = fname; 
} 
function set_lname(y){ 
    this.lname = lname; 
} 
function get_name(){ 
    with (this) { 
     return fname + ' ' + lname; 
    } 
} 

person_obj = new Person(); 
person_obj.set_fname('Foo'); 
person_obj.set_lname('Bar'); 

// person_obj = new Person('Foo', 'Bar'); 

person_obj = get_name(); // returns "Foo Bar" 

iyi örnek düşünemiyorum. JavaScript sınıfa bir değişken tanımlamamız

+0

fonksiyonu "Kişi (fname, lname)" işlevi, "Person()' fonksiyonunun tanımının üzerine yazacaktır, bu, javascript'te aşırı yükleme fonksiyonunun nasıl yapılacağı değildir. – aularon

+0

Efendim, aşırı yüklemeye niyetim yoktu. Bunlar seçenekler. Bekle, cevabı düzenlememe izin ver. – simplyharsh

+1

Bu gerçekten kötü bir örnek, hiç prototip hakkında duydunuz mu? :/Ayrıca 'with' kullanarak Crockford ve diğerleri tarafından zararlı olarak kabul edilir, eğer' with' içinde özelliği olan nesne üzerinde yoksa, bunun yerine bir global değişken belirleyeceksiniz. –

0

3 yolu: özelliklerini tanımlamak için

1) Apple bir nesne örneğini için, 'bu' anahtar kelimesini

function Apple (type) { 
    this.type = type; 
    this.color = "red"; 
} 

kullanın) (fonksiyonu kullanılarak oluşturulan sınıf, aşağıdakileri yapabilirsiniz bazı özellikleri ayarlayın:

var apple = new Apple('macintosh'); 
apple.color = "reddish"; 

2) kullanma Değişmez Notasyonu'nu

var elma = {
türü: "macintosh",
rengi: "kırmızı"

} Bu durumda

yapmanız gerekenler (ve olamaz) yok bir örneğini oluşturmak sınıfın zaten var.

apple.color = "reddish"; 

3) Singleton

var apple = new function() { 
    this.type = "macintosh"; 
    this.color = "red"; 
} 

Yani bu, yukarıda tartışılan 1'e çok benzer olduğu görülmektedir, ancak nesneyi kullanmak için bir yol kesin olarak gibi bir işlev kullanılarak 2.

apple.color = "reddish"; 
+2

JSON değil, öyle görünüyor. ECMAScript, oluşturulduğundan beri nesne değişmez sözdizimi için destek aldı. Bir nesne değişkeni, JSON özelliklerinin izin verdiğinden çok daha fazlasını desteklemektedir (bunlarla sınırlı olmamakla birlikte, işlev değerleri, oluşturulmuş ve yazılan nesneler ve kullanılmayanlar gibi [değiştirilmemiş] parametre adları). – eyelidlessness

+0

Bildirimde bulunduğunuz için teşekkür ederiz .. :) –

3

JavaScript'te sınıflar diye bir şey olmadığını anlamak önemlidir. Orada klasik bir kalıtım modelini simüle eden bazı çerçeveler var, ama teknik olarak hepsi constructor functions and prototypes'a kadar kaynıyor.

Person.prototype = PersonProto; 

Ve voilà:

var a = new Person(); 
alert(a.fname); 
35

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.

+0

+1 This. Diğer cevapların çoğu sadece "sınıf" terimini kullanmalarıyla kafa karıştırıcıdır. –

+0

@BGerissen: Elinizde çok fazla zamanınız olmalı;) Cevabınızın son bölümüne katılmıyorum. Bir nesne * her zaman * kendi prototipine bir referansı vardır, bu nedenle temsilci kullanarak herhangi bir şey kazanamazsınız. Nesneler prototip üyelerine yapılan referansları devralmaz; dinamik çalışma zamanı çözünürlüğünü kullanırlar (miras yöntemlerini genişletmek veya değiştirmek için iyi bir şeydir) – user123444555621

+0

@ Pumbaa80 biraz daha düşünün;) – BGerrissen

0

Ayrıca bu yaklaşımı deneyebilirsiniz:

 function name(){ 
      this.name; 
      this.lastname; 
     } 
     name.prototype.firstName=function(name){ 
      this.name = name; 
      alert(this.name); 

     } 
     var x = new name(); 
     x.firstName("Kartikeya"); 
İlgili konular