2011-03-26 19 views
6

JavaScript'teki alıcılar ve ayarlayıcıları araştırıyorum ve jQuery's $ .extend ve Underscore's _.extend gibi nesneleri genişletmek için yayılma işlevleriyle ne kadar iyi gittiklerini araştırıyorum. Chrome ve Firefox'taJavaScript yükselticileri/belirteçler ve genişletme nesneleri

var test = { 
    get size() { return this._size; }, 
    set size(val) { this._size = val; }, 
} 

test.size = "LARGE"; 
console.log(test.size); 

//$.extend(test, { get size() { return "MEDIUM"; } }); 
_.extend(test, { get size() { return "MEDIUM"; } }); 

console.log(test.size); 
test.size = "SMALL"; 
console.log(test.size); 

alıyorum:

LARGE 
MEDIUM 
SMALL 

birileri bana neler açıklayabilir şöyle kod kurulum nedir? Orijinal ayarlayıcıyı aradıktan sonra, orijinal alıcı da geri yüklenir mi? ,

_.extend = function(obj) { 
    each(slice.call(arguments, 1), function(source) { 
    for (var prop in source) obj[prop] = source[prop]; 
    }); 
    return obj; 
}; 

Bu kaynak nesnenin özelliklerini dolaşır hedef nesneye ekler ve sonra hedef nesneyi döndürür:

+1

ben düşünüyorum getter, hem orijinal ayarlayıcıyı hem de alıcıyı değiştirir ve sonuçta bu özellik, 'size' boyutunu "SMALL" olarak ayarlar. Konsol.log (this._size); 'en sonunda ne aldığınızı görün .. – JCOC611

+0

@ JCOC611 - Ben öyle düşünmüyorum. Bir açıklama için cevabımı görün. –

cevap

5

Underscore en extend buna benzer.

olduğunu
obj['size'] = source['size'] 

, yeni nesnenin getter kullanır, ancak kopya yalnızca değeri o gaz giderici tarafından döndürülen: nesneye kopyalar size özelliği uzanan yaparken, temelde bunu yapar. Alıcının kendisini aktarmıyor.

ayrıca Bunu göstermek için, aşağıdakileri deneyin: Yalnızca çıkışı Hangi

var test = { 
    get size() { return this._size; }, 
    set size(val) { this._size = val; }, 
} 

for (var p in test) { 
    console.log(p) 
} 

: (. Bu alıcılar veya ayarlayıcılar yineleme gelmez)

size 

+2

Dolaplar/ayarlayıcılar üzerinden kopyalanan bir genişletme yöntemi yazmaktan nasıl bahsederim? – semicolon