JavaScript Yapıcısını argümanlar için bir dizi kullanarak çağır
Aşağıdaki gibi bir JavaScript yapıcı (constructor) fonksiyonum var ve yapıcıya parametreleri bir diziden vermek istiyorum:
function dataRow(value1, value2, value3, value4, value5) {
this.val1 = value1;
this.val2 = value2;
this.val3= value3;
this.val4 = value4;
this.val5 = value5;
}
Şimdi yapıcı (constructor) argümanlarının bir dizi tarafından sağlanmasını istiyorum:
var dataArray = new Array();
dataArray("Value1","Value2","Value3","Value4","Value5","Value6"...........)
Bu kısmın (value1, value2, value3, value4, value5) dataArray’imden doldurulmasını istiyorum.
Cevap #1
Modern ortamlarda, spread notasyonu kullanabilirsiniz:
var row = new dataRow(...dataArray);
function dataRow(v1, v2, v3, v4, v5) {
this.v1 = v1;
this.v2 = v2;
this.v3 = v3;
this.v4 = v4;
this.v5 = v5;
}
var dataArray = [1, 2, 3, 4, 5];
var row = new dataRow(...dataArray);
console.log(row.v1);
console.log(row.v2);
console.log(row.v3);
console.log(row.v4);
console.log(row.v5);Daha eski ortamlarda bunu yapmak gerçekten zahmetlidir. Sizin özel durumunuzda, muhtemelen sadece zor yoldan yapmak en iyisidir:
dataRow(dataArray[0], dataArray[1], dataArray[2], dataArray[3], dataArray[4]);
Ya da oluşturmayı çağrıdan ayırabilir ve bunu Function#apply ile çağırabilirsiniz:
var row = Object.create(dataRow.prototype);
dataRow.apply(row, dataArray);
function dataRow(v1, v2, v3, v4, v5) {
this.v1 = v1;
this.v2 = v2;
this.v3 = v3;
this.v4 = v4;
this.v5 = v5;
}
var dataArray = [1, 2, 3, 4, 5];
var row = Object.create(dataRow.prototype);
dataRow.apply(row, dataArray);
console.log(row.v1);
console.log(row.v2);
console.log(row.v3);
console.log(row.v4);
console.log(row.v5);Bu, class ile oluşturulmuş bir yapıcı ile çalışmaz, ancak onu class ile oluşturuyorsanız, yayma (spread) gösterimini kullanın; bunlar aynı zamanda tanıtıldı (ES2015).
Bunu yapmamanızı önerebilirim, özellikle de aşağıdaki yorumunuz ışığında:
...bunu dinamik olarak nasıl oluşturulur this.val1=value1; this.val2=value2; this.val3= value3;...
Bunun yerine, tek bir dizi özelliği kullanın ve ya sakladığınız ya da kopyaladığınız bir dizi geçirin:
function dataRow(values) {
this.values = values;
// or: this.values = values.slice();
// to make a shallow copy
}
var dataArray = [1, 2, 3, 4, 5];
var row = new dataRow(dataArray);
console.log(row.values);