目标是跟踪数组更改(基于长度)。
我找到了解决方案的一部分,我遇到了第二个问题:
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 =(
答案 0 :(得分:0)
答案 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 */ });