1.0.1 • Published 7 years ago
proxy-frozen-object v1.0.1
proxy-frozen-object
ES Proxy for Object.freeze(object).
Why this library is needed?
ES Proxy can not proxy frozen object directly.
Following example throw an TypeError.
Because, ES Proxy can not proxy for Object.freeze(object) directly.
TypeError: proxy must report the same value for the non-writable, non-configurable property '"hello"'
const myObject = {
hello: function() { return 'Hello!'; },
bye: function() { return 'Bye!'; }
};
console.log(myObject.hello()); // "Hello!"
console.log(myObject.bye()); // "Bye!"
// Freeze the object
Object.freeze(myObject);
// Create an proxy for myObject
const proxied = new Proxy(myObject, {
get: function(target, name, receiver) {
if (name === 'hello'){
return function() { return 'Hi!'; };
}
return Reflect.get(target, name, receiver);
}
});
// ERROR!
console.log(proxied.hello()); // TypeError: proxy must report the same value for the non-writable, non-configurable property '"hello"'How to resolve this issue?
This library that create an proxy for dummy object.
It is means that does not proxy myObject directly.
It Proxy myObject indirectly for avoiding TypeError.
const myObject = {
hello: function() { return 'Hello!'; },
bye: function() { return 'Bye!'; }
};
console.log(myObject.hello()); // "Hello!"
console.log(myObject.bye()); // "Bye!"
// Freeze the object
Object.freeze(myObject);
// Create an Proxy for {} (dummy object)
const proxied = new Proxy({}, {
get: function(target, name, receiver) {
if (name === 'hello'){
return function() { return 'Hi!'; };
}
// Reflect myObject instead of target
// if it is not `hello` method, return `myObject["hello"]`
return Reflect.get(myObject, name, receiver);
}
});
console.log(proxied.hello()); // "Hi!"
console.log(proxied.bye()); // "Bye!"Install
Install with npm:
npm install proxy-frozen-objectUsage
createProxyForFrozenObject: <T extends object>(target: T, proxyHandler: ProxyHandler<T>) => T
proxyHandler is same API with Methods of the handler object of ES Proxy.
import { createProxyForFrozenObject } from "proxy-frozen-object";
const myObject = {
hello: function() {
return "Hello!";
},
bye: function() {
return "Bye!";
}
};
Object.freeze(myObject);
const proxied = createProxyForFrozenObject(myObject, {
get: function(target, name, receiver) {
if (name === "hello") {
return function() {
return "Hi!";
};
}
return Reflect.get(target, name, receiver);
}
});
console.log(proxied.hello()); // "Hi!"Changelog
See Releases page.
Running tests
Install devDependencies and Run npm test:
npm testContributing
Pull requests and stars are always welcome.
For bugs and feature requests, please create an issue.
- Fork it!
- Create your feature branch:
git checkout -b my-new-feature - Commit your changes:
git commit -am 'Add some feature' - Push to the branch:
git push origin my-new-feature - Submit a pull request :D
Author
License
MIT © azu
References
1.0.1
7 years ago