Skip to content

Instantly share code, notes, and snippets.

@jorendorff
Last active October 7, 2023 23:19
Show Gist options
  • Star 1 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save jorendorff/85d74ef7dce0118664535f84d57d6788 to your computer and use it in GitHub Desktop.
Save jorendorff/85d74ef7dce0118664535f84d57d6788 to your computer and use it in GitHub Desktop.
function wetA() {};
function wetB() {};
wetB.prototype = new wetA();
var wet_b = new wetB();
// Reflect.get(wetB, "prototype") === Reflect.getPrototypeOf(wet_b);
// boilerplate, not really that important
function valueType(value) {
if (value === null)
return "primitive";
const type = typeof value;
if ((type != "function") && (type != "object"))
return "primitive";
return type;
}
// The WeakMap for the "dry" object graph's proxies
const wetToDry = new WeakMap();
// Map from shadow targets to real targets.
const shadowToWet = new WeakMap();
function wrap(wet) {
if (valueType(wet) === "primitive")
return wet;
let dry = wetToDry.get(wet);
if (dry === undefined) {
let shadow = {};
dry = new Proxy(shadow, h);
wetToDry.set(wet, dry);
shadowToWet.set(shadow, wet);
}
return dry;
}
// The handler for the "dry" object graph's proxies
const h = {
get: function(target, key, receiver) {
let realTarget = shadowToWet.get(target);
return wrap(Reflect.get(realTarget, key, receiver));
},
getPrototypeOf: function(target) {
let realTarget = shadowToWet.get(target);
let rv = wrap(Reflect.getPrototypeOf(realTarget));
Reflect.setPrototypeOf(target, rv);
return rv;
}
};
var dry_b = wrap(wet_b);
var dryB = wrap(wetB);
// Everything is wonderful!
Object.freeze(wet_b);
//Object.freeze(wetB);
const assert = require('assert');
var proto1 = Reflect.getPrototypeOf(wet_b);
var proto2 = Reflect.get(wetB, "prototype");
assert(proto1 === proto2);
var proto1 = Reflect.getPrototypeOf(dry_b);
var proto2 = Reflect.get(dryB, "prototype");
assert(proto1 === proto2);
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment