Я пытаюсь добавить элементы в массив, который оценивается по лени. Это означает, что значение для них не будет рассчитываться или быть известным, пока они не будут доступны. Это как предыдущий вопрос который я задал, но для объектов.
То, что я закончил для объектов, было
Object.prototype.lazy = function(var_name, value_function) {
this.__defineGetter__(var_name, function() {
var saved_value = value_function();
this.__defineGetter__(var_name, function() {
return saved_value;
});
return saved_value;
});
}
lazy('exampleField', function() {
// the code that returns the value I want
});
Но я не понял способ сделать это для реальных массивов. В массивах нет таких сеттеров. Вы можете нажать функцию в массив, но вам нужно будет назвать ее функцией, чтобы вернуть объект, который вы действительно хотите. То, что я делаю прямо сейчас, я создал объект, который я рассматриваю как массив.
Object.prototype.lazy_push = function(value_function) {
if(!this.length)
this.length = 0;
this.lazy(this.length++, value_function);
}
Так что я хочу знать, есть ли способ сделать это, продолжая делать это в массиве, а не поддельный массив?
UPDATE: Следующая функция работает, только если value_function возвращает примитивный тип данных.
Array.prototype.lazy_push = function(value_function) {
var a = this,
i = this.length;
this.push({
toString: function() {
return a[i] = value_function();
}
});
}
Если вы попытаетесь нажать на объект, имеющий в нем свойства, вы не сможете получить доступ к свойствам до тех пор, пока вы не получите доступ к объекту напрямую. Это не происходит с сеттерами, поэтому я хочу, чтобы какой-то синтаксис настроек для Javascript. На данный момент я буду использовать поддельный массив, которого достаточно для того, что я делаю.