Цель - отслеживать изменения массива (в зависимости от длины).Длина массива дорожек js
я нашел решение одной части, и я нахожусь в беде с второй:
var arr = Object.create([])
, _length = 0
;
Object.defineProperty(arr, 'length', {
enumerable: true,
get: function() {
return _length;
},
set: function (length) {
//TODO: you can compare and do some action here
_length = length;
}
});
может быть, это было бы полезно для вас, так как это будет отслеживать все изменения, внесенные для обр, с использованием методов Array (толчок, поп, смещение ...)
но вот я пришел ко второй части: если вы используете индекс присвоить некоторые значения, как
arr[0] = 1;
это не будет работать: длина оставаться же, и трекинг не работает = (
так может кто-нибудь мне помочь?
добавил: нормально, MDN говорит нам:
При установке свойства в массиве JavaScript, когда свойство является допустимым индексом массива и индекс выходит за пределами текущих пределов массива, двигатель обновит свойство длины массива соответственно
Кто-нибудь знает, как это происходит ???
Я чувствую, что этот вновь созданный arr должен быть экземпляром массива, поэтому мне кажется, что я должен сделать что-то вроде this.
добавлен x2:
var _length = 0
, arr = Object.create(Array.prototype, {
\t \t length: {
\t \t \t enumerable: true,
\t \t \t get: function() {
\t \t \t \t return _length;
\t \t \t },
\t \t \t set: function (length) {
\t \t \t \t console.log('[debug] newLength/oldLength: ', length+'/'+_length);
\t \t \t \t _length = length;
\t \t \t }
\t \t }
\t })
;
Теперь обр является экземпляром Array (обр InstanceOf Array -> истина), но по-прежнему обр [0] = 1 не будет вызывать длину сеттер = (
КСТАТИ: Array.isArray (arr) вернет false (очевидно), но для моего случая это нормально. –
Я пытаюсь понять, какова ваша фактическая цель? Возможно, вы могли бы объяснить немного дальше? – Xotic750
Ваш запрос должен быть функцией длины массива, о котором вам нужно знать, нет решения, которое инкапсулирует нужные вам функции. –