2015-07-31 21 views
7

ES6 Ok işlevleri, prototype.object ile bir nesneye işlev atamak için işe yaramazsa. Aşağıdaki örnekleri inceleyin: Object.prototype sözdizimi ile ok fonksiyonlarını nesne tanımı eserlerinde açıkça ok fonksiyonu kullanılarak fakatES6 ok işlevleri prototip üzerinde çalışmıyor mu?

function Animal(name, type){ 
this.name = name; 
    this.type = type; 
    this.toString =() => `${this.name} is a ${this.type}`; 

} 
var myDog = new Animal('Max', 'Dog'); 
console.log(myDog.toString()); //Max is a Dog 

yapmaz:

function Animal2(name, type){ 
    this.name = name; 
    this.type = type; 
} 
Animal2.prototype.toString =() => `${this.name} is a ${this.type}`; 

var myPet2 = new Animal2('Noah', 'cat'); 
console.log(myPet2.toString()); //is a undefined 

Sadece kavramının bir kanıtı olarak

function Animal3(name, type){ 
    this.name = name; 
    this.type = type; 
} 
Animal3.prototype.toString = function(){ return `${this.name} is a ${this.type}`;} 

var myPet3 = new Animal3('Joey', 'Kangaroo'); 
console.log(myPet3.toString()); //Joey is a Kangaroo 

mıyım şeyler eksik bariz: Object.prototype sözdizimi ile Şablon dize sözdizimi kullanarak çalışır? Örnek 2'nin mantıklı çalıştığını hissediyorum, ancak çıktı tarafından şaşırıyorum. Tahmin ediyorum, bu bir kapsam belirleme meselesi, ama çıkış tarafından atıldım 'undefined' dir.

ES6 Fiddle

+0

olası kopyası [Arrow işlevi vs işlev bildirimi/ifadeleri: Onlar eşdeğer/değiştirilebilir mi?] (Http://stackoverflow.com/q/34361379/1048572) – Bergi

+2

@Bergi Soruma 10 ay önce gönderildi ve 0 upvotes. 5 ay önce yayınlanan bir sorunun kopyası nasıl olabilir, ve şimdi buna karar vermek neden önemlidir? –

+1

Burada atanan bir suç yok (ayrıca bu soruya cevap vermedim, ancak sadece bir yorum yazdım). Tek önemli şey, gelecekteki okuyucuların bu konudaki çok yararlı kanonik yazıya yöneltilmesi ve bu yüzden onu bağladım. – Bergi

cevap

11

Ok fonksiyonları bir sözcük this sağlarlar. Bu fonksiyon değerlendirildiğinde mevcut olan this kullanır.

Mantıksal eşdeğerdir

(Aşağıda değişken this adlandırılmış olamaz çünkü geçerli bir kod değil):

(function(this){ 
    // code that uses "this" 
})(this) 

senin 1 örnekte ok fonksiyonu yapıcı içerisinde olduğunu ve this yeni oluşturulan örneğe işaret eder.

Üçüncü örneğinizde, bir ok işlevi kullanılmıyor ve standart this davranışı her zaman olduğu gibi çalışır (bu işlev kapsamında bulunur).

İkinci örneğinizde, bir ok işlevi kullanırsınız ancak değerlendirilen kapsamda, this global/undefined şeklindedir.

+0

Bu yüzden kurucunun dışındaki Ok İşlevleri ile kullanılması mümkün değil (Örnek 2)? –

+1

"Bu", olmasını istediğiniz her yerde kullanabilirsiniz. Örneğin, nesnenizin kendisine birden çok işlev ekleyen bir 'setup()' işlevi olduğunu varsayalım ve bunu şöyle diyeceksin: 'myObj.setup()'. Bu işlev, gerekli işlevleri eklemek için ok işlevlerini kullanabilir. Bir başka, daha tipik kullanım durumu ise, başlatıcı bağlamın 'bu' bölümüne erişmesi gereken geri çağırma işlevlerinin kullanıldığı yerdir. – Amit

+3

* "Ok işlevleri bu sözcükleri sağlar" * Ok işlevlerinin bir 'bunu 'sağladığını söylemek daha doğru olur, dolayısıyla kendi sözcüksel kapsamı yerine dış sözcüksel kapsamdan gelir. –

İlgili konular