2015-02-15 25 views
19

Ben küçük bir JavaScript oyun çerçevesini yazma ve genellikle nesnelerin kullanmak özellikleriniYerel işlevlerde bu anahtar sözcüğünden nasıl kurtulabilirim?

this.depth = this.y; 

gibi Ancak bu this 'es oldukça rahatsız edici ediyorum @ _ @. Yazmak için bir yol var mı?

… genel nesneyi etkilemiyor mu?

Benim örneklerini iki fabrika fonksiyonları vasıtasıyla oluşturulur ve bunlar önceden tanımlı değişken sınırlı listesini yapmak, böylece hepsi hepsi değiştirilebilir olsa Fonksiyonlar, .apply() yöntemiyle örneklerine uygulanır vb depth, y var.

this anahtar kelimesini atlamam gerekmesinin nedeni, çerçevenin yalnızca benim için değil, başka insanlar için de tasarlanmış olmasıdır. Çerçevenin kendisinde this'u kaldırmam gerekmiyor, ancak bu kitaplığa dayalı uygulamaları kodlarken this anahtar kelimesi çok zaman harcıyor. Şimdiye kadar bildiğim tek çözüm 'özel' değişkenler yapmaktır, ancak daha önce JavaScript'le çalışmayan ve obj1'i obj2'den manipüle eden kişiler için .apply - çok daha fazla anonim işlevlere neden olan bazı rahatsızlıklara neden olmaktadır. Yani, gördüğüm gibi, JavaScript'te her derde deva yok.

Yapıcılar:

/*...*/ 
'Copy' : function (type) { 
    var obj = { 
    'x':0, 
    'y':0, 
    'xprev':0, 
    'yprev':0, 
    /*...*/ 
    }; 
    return obj; 
}, 
'make' : function (type,x,y) { 
    obj = ct.types.Copy(type); 
    obj.x = obj.xprev = obj.xstart = x; 
    obj.y = obj.yprev = obj.ystart = y; 

    /*...*/ 

    ct.stack.push(obj); 
} 
/*...*/ 
+5

XY sorunu gibi görünüyor. – elclanrs

+0

no sanırım, bunu geçerli nesneyi kullanmak için kullanmalısınız –

+0

'this = t; t.depth = y' ... ama evet, 'bu' dilin bir parçası. – serakfalcon

cevap

11

Sorunuz, fabrikalar ve kapanışları dayanan "modern" JavaScript OOP eski "özenti Java daha az ayrıntılı ve daha deyimseldir herhangi bir kod görmeden cevap vermek zor, ama genel olarak "new" ve this 'lar ile stil.

Eski stil:

function Something() { 
    this.depth = 0; 
} 
Something.prototype.incDepth = function() { 
    this.depth++; 
} 
foo = new Something() 

Yeni stil:

function Something() { 
    var depth = 0; 
    return { 
     incDepth: function() { 
     depth++; 
     } 
    } 
} 
foo = Something() 
+14

"Yeni stil" in, her örnek için 'incDepth'in çok sayıda kopyasını oluşturduğundan daha az etkili olduğu uyarısında. Gerçek bir sınıf olmaksızın kod devralmasıyla daha verimli bir Java benzeri nesneye sahip olmak bu prototipin ve budur. – deceze

+5

"Yeni stil" ayrıca, prototiplerin genişletilmesini de engeller (siz aynı sonucu elde etmek için * aynı işlevi elde edip, sonuca bir yöntem ekleyen bir sarmalayıcı ile yapıcı işlevini değiştirebilir, ancak bu daha fazla hataya neden olabilir) veya belirleme Bir nesnenin türü, "eski stil" ile yazılmış, iyi belgelenmiş kütüphanelerin etrafında kafanızı almaya çalışırken genellikle yararlı olan ".constructor" özelliğini kontrol ederek. –

İlgili konular