Soru zaten cevaplanmış gibi görünüyor, ancak OP, Java'da yaptığımız gibi ve seçilen cevap yeterli değil (imho).
Aşağıdaki açıklama ile, bir nesnenin sınıfını alabiliriz (aslında javascript'te prototip olarak adlandırılır).
var arr = new Array('red', 'green', 'blue');
var arr2 = new Array('white', 'black', 'orange');
Bunun gibi bir mülk ekleyebilirsiniz:
Object.defineProperty(arr,'last', {
get: function(){
return this[this.length -1];
}
});
console.log(arr.last) // blue
Ancak .last
özellik yalnızca arr
Array prototipinden başlatılan nesne için kullanılabilir olacaktır . Bu nedenle, .last
özelliğin Array prototipinden başlatılmış tüm nesneler için kullanılabilir olması için, Array prototipinin .last
özelliğini tanımlamamız gerekir :
Object.defineProperty(Array.prototype,'last', {
get: function(){
return this[this.length -1];
}
});
console.log(arr.last) // blue
console.log(arr2.last) // orange
Buradaki problem, ' arr
' ve ' arr2
' değişkenlerinin hangi nesne türüne (prototip) ait olduğunu bilmeniz gerekir! Başka bir deyişle, ' arr
' nesnesinin sınıf türünü (prototip) bilmiyorsanız , onlar için bir özellik tanımlayamazsınız. Yukarıdaki örnekte, arr'ın Array nesnesinin bir örneği olduğunu biliyoruz, bu yüzden Array için bir özellik tanımlamak için Array.prototype kullandık. Ama ya ' arr
' sınıfını (prototip) bilmeseydik ?
Object.defineProperty(arr.__proto__,'last2', {
get: function(){
return this[this.length -1];
}
});
console.log(arr.last) // blue
console.log(arr2.last) // orange
Gördüğünüz gibi, ' arr
' bir Array olduğunu bilmeden, sadece ' arr
' sınıfını kullanarak ' arr.__proto__
' kullanarak yeni bir özellik ekleyebiliriz .
Array'ın arr
bir örneği olduğunu bilmeden ' ' prototipine eriştik ve bence OP bunu sordu.