js track array length

时间:2015-12-21 20:28:33

标签: javascript arrays

目标是跟踪数组更改(基于长度)。

我找到了解决方案的一部分,我遇到了第二个问题:

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;
    }
});

也许这对你有用,因为它会跟踪对arr所做的所有更改,使用数组方法(push,pop,shift ...)

但是我来到第二部分:如果你使用索引分配一些值,比如

arr[0] = 1;

这不起作用:长度保持不变,跟踪不起作用=(

所以有人可以帮助我吗?

加入: 好吧,MDN告诉我们:

  

当属性为a时,在JavaScript数组上设置属性   有效的数组索引和该索引超出了当前的范围   数组,引擎将相应地更新数组的长度属性

有谁知道,这是怎么发生的?

我感觉,这个新创建的arr必须是Array的实例,所以我似乎必须做this之类的事情。

添加了x2:

var _length = 0
  , arr = Object.create(Array.prototype, {
		length: {
			enumerable: true,
			get: function () {
				return _length;
			},
			set: function (length) {
				console.log('[debug] newLength/oldLength: ', length+'/'+_length);
				_length = length;
			}
		}
	})
  ;

现在arr是Array的实例(arr instanceof Array - > true),但仍然arr [0] = 1不会触发长度setter =(

2 个答案:

答案 0 :(得分:0)

您可能需要查看this question

它解释了您可能感兴趣的一些选项。

#2似乎是你正在寻找的好人选。

答案 1 :(得分:0)

如果您想获得一些乐趣,可以使用spec for observables objects/arrays,或者使用underscore / lodash(它们可以互换)和扩展名:https://github.com/mennovanslooten/underscore-observe它&# 39;易于使用:

_.observe(some_array, function(new_array, old_array) { /* called for every change */ });