Source code
Revision control
Copy as Markdown
Other Tools
/* Any copyright is dedicated to the Public Domain.
// Test details of the implementation of ToPropertyDescriptor exposed to scripts
// thanks to scriptable proxies.
// A LoggingProxy object logs certain operations performed on it.
var log = [];
function LoggingProxy(target) {
return new Proxy(target, {
has: function (t, id) {
log.push("has " + id);
return id in t;
},
get: function (t, id) {
log.push("get " + id);
return t[id];
}
});
}
// Tragically, we use separate code to implement Object.defineProperty on
// arrays and on proxies. So run the test three times.
var testSubjects = [
{},
[],
new Proxy({}, {})
];
for (var obj of testSubjects) {
log = [];
// Object.defineProperty is one public method that performs a
// ToPropertyDescriptor call.
Object.defineProperty(obj, "x", new LoggingProxy({
enumerable: true,
configurable: true,
value: 3,
writable: true
}));
// It should have performed exactly these operations on the proxy, in this
// order. See ES6 rev 24 (2014 April 27) 6.2.4.5 ToPropertyDescriptor.
assertDeepEq(log, [
"has enumerable", "get enumerable",
"has configurable", "get configurable",
"has value", "get value",
"has writable", "get writable",
"has get",
"has set"
]);
}
reportCompare(0, 0);