Skip to content

Commit 6a06cf5

Browse files
authored
Merge pull request #49 from vcatechnology/non-enumerable-length
Prevent internal __length property from being enumerable
2 parents 30171cc + d9429bb commit 6a06cf5

File tree

2 files changed

+24
-3
lines changed

2 files changed

+24
-3
lines changed

observable-slim.js

Lines changed: 7 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -61,8 +61,13 @@ var ObservableSlim = (function() {
6161
// in order to accurately report the "previous value" of the "length" property on an Array
6262
// we must use a helper property because intercepting a length change is not always possible as of 8/13/2018 in
6363
// Chrome -- the new `length` value is already set by the time the `set` handler is invoked
64-
if (target instanceof Array) target.__length = target.length;
65-
64+
if (target instanceof Array) {
65+
if (!target.hasOwnProperty("__length"))
66+
Object.defineProperty(target, "__length", { enumerable: false, value: target.length, writable: true });
67+
else
68+
target.__length = target.length;
69+
}
70+
6671
var changes = [];
6772

6873
/* Function: _getPath

test/test.js

Lines changed: 17 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -774,7 +774,23 @@ function suite(proxy) {
774774
expect(p.test.deeper.__getPath).to.equal("test.deeper");
775775
expect(p.arr[0].test.__getPath).to.equal("arr.0.test");
776776
}
777-
777+
778+
});
779+
780+
it('42. Array does not enumerate __length.', () => {
781+
var largeArray = [];
782+
783+
for (var i = 0; i < 5; i++) {
784+
largeArray.push({
785+
"hello":"world"
786+
,"foo":"bar"
787+
});
788+
}
789+
790+
var proxyArr = ObservableSlim.create(largeArray, false, function(changes) {});
791+
792+
var keys = Array.from(proxyArr.keys());
793+
expect(keys.every(item => !Number.isNaN(item))).to.be.true;
778794
});
779795

780796
};

0 commit comments

Comments
 (0)