Skip to content

Instantly share code, notes, and snippets.

@Reizinixc
Created June 15, 2018 09:19
Show Gist options
  • Save Reizinixc/42b9a5591b5e3497fff21f771920ef67 to your computer and use it in GitHub Desktop.
Save Reizinixc/42b9a5591b5e3497fff21f771920ef67 to your computer and use it in GitHub Desktop.
fieldMutateProtectedProxyHandler
const fieldMutateProtectedProxyHandler = (() => {
const MemberType = Object.freeze({
PROPERTY: Symbol('PROPERTY'),
METHOD: Symbol('METHOD'),
FIELD: Symbol('FIELD'),
UNKNOWN: Symbol('UNKNOWN')
});
function getMemberType(target, key) {
if (!(key in target)) {
return MemberType.UNKNOWN;
}
const descriptor = Object.getOwnPropertyDescriptor(Object.getPrototypeOf(target), key);
if (descriptor.get || descriptor.set) {
return MemberType.PROPERTY;
}
if (typeof descriptor.value === 'function') {
return MemberType.METHOD;
}
return MemberType.UNKNOWN;
}
return {
get(target, property) {
const memberType = getMemberType(target, property);
if (memberType === MemberType.FIELD) {
throw new Error(`Field '${property}' cannot be read outside the class.`);
}
const result = target[property];
if (memberType === MemberType.PROPERTY) {
return result;
}
return (argumentsList) => result.apply(target, argumentsList);
},
set(target, property, value) {
const memberType = getMemberType(target, property);
if (memberType === MemberType.FIELD) {
throw new TypeError(`Field '${property}' cannot be assigned outside the class.`);
}
if (memberType === MemberType.METHOD) {
throw new TypeError(`Method '${property}' cannot be assigned.`);
}
console.log(memberType);
target[property] = value;
return true;
}
};
})();
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment