Bu kod referansları (işaretçiler) simüle diğer dillerde olduğu gibi:
Array.prototype.subarray = function(i, j){
var self = this, arr = [];
for(var n = 0;i <= j; i++, n++){
(function(i){
Object.defineProperty(arr, n, { //Array is an Object
get: function(){
return self[i];
},
set: function(value){
self[i] = value;
return value;
}
});
})(i);
}
return arr;
}
//This is the exact code you have in your question
var foo = [1, 2, 3, 4, 5];
var bar = foo.subarray(2, 4);
console.log(bar); // [3, 4, 5]
bar[0] = 'hello, world'; // some magic happens here
console.log(bar); // ['hello, world', 4, 5]
console.log(foo); // [1, 2, 'hello, world', 4, 5]
Demo: http://jsfiddle.net/DerekL/y7z9T/
subarray
gelmez İşte
bir çalışma Demosu olduğunu yaratıcı değil e Orijinal Diziyi kopyalayarak yeni bir Dizi; Özel
getters ile boş bir Dizi oluşturur. Akılda tutulması gereken bir şey, yeni dizideki değerlerin, bellek yerine orijinal dizideki dizine bağlanmasıdır.
index
0 1 2 3 4
┌────────────┐
┌───┬───┬┤───┬───┬───┐│
│ 1 │ 2 ││ 3 │ 4 │ 5 ││
└───┴───┴┤───┴───┴───┘│
└────────────┘
├──── Whole Array ────┤
├─ SubArray ─┤
"Alt dizi", orijinal dizi için bir "pencere" sağlar. Normalde yaptığınız gibi her iki dizide de içeren değerleri değiştirebilir ve alabilirsiniz. Bunlardan herhangi birinin değiştirilmesi her ikisini de etkileyecektir. Ancak, yeni öğeleri "alt diziye" zorlamaya çalışırsanız kötü şeyler olur, bu yüzden yapmayın.
defineProperty
hakkında daha fazla bilgi için lütfen visit MDN. Maalesef
Evet kullanarak 'slice' istediğim şey için çalışmıyor. Buradaki fikir, * aynı * diziye yeni bir görünüm kazandırmaktır (tek fark başlangıç dizinidir), yeni bir tane oluşturmaz. –
Aslında, setterler ve alıcılar kullanılarak mümkündür. Pratik değil ama mümkün. – Gio