-
Notifications
You must be signed in to change notification settings - Fork 110
Private members break proxies #106
Description
I commented on an old issue in tc39/proposal-private-fields#102 but after reading the answer I feel like I should re-open an issue.
It's been discussed before: current PrivateName spec doesn't tunnel through proxies.
In my opinion the consequences have been under-evaluated.
Proxies are already quirky: they don't work with internal slots (bye Number, Date, Promise and friends), they change the identity of this (no equality, no WeakMap).
But at least, they work on classes.
So they are useful. Libraries and frameworks can provide many features that motivated building proxies: automatic logging, lazy objects, dependency detection and change tracking.
My point here is that PrivateName and Proxy don't work together. You have to choose one of the two features and give up on the other. Partitionning JS features in this way is terrible.
Here is a basic example.
Let's say a library provides logReads, a function that writes on the console every member that is read.
function logReads(target) {
return new Proxy(target, {
get (obj, prop, receiver) {
console.log(prop);
return target[prop];
},
});
}Now let's say I'm writing an application and I use private fields for encapsulation, because they're nice.
class TodoList {
#items = [];
threshold = 50;
countCheap() {
return this.#items.reduce((n, item) => item.price < this.threshold ? n : n + 1, 0);
}
}I would like to use that nice logging library to better understand what happens when I run my code.
Seems legit from a naive user's perspective:
let list = logReads(new TodoList);
list.countCheap(); // BOOOMAhaha gotcha! And if you don't know the source code, why it crashes when inside a proxy might be a unpleasant mystery.
Please reconsider. All it takes to solve this is make PrivateName tunnel through proxy (no interception, encapsulation is fine).
Don't think that returning bound functions from the proxy will solve this. It might seem better but creates many new issues of its own.