proxy-frozen-object
TypeScript icon, indicating that this package has built-in type declarations

1.0.1 • Public • Published

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-object

Usage

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 test

Contributing

Pull requests and stars are always welcome.

For bugs and feature requests, please create an issue.

  1. Fork it!
  2. Create your feature branch: git checkout -b my-new-feature
  3. Commit your changes: git commit -am 'Add some feature'
  4. Push to the branch: git push origin my-new-feature
  5. Submit a pull request :D

Author

License

MIT © azu

References

Package Sidebar

Install

npm i proxy-frozen-object

Weekly Downloads

11

Version

1.0.1

License

MIT

Unpacked Size

16 kB

Total Files

7

Last publish

Collaborators

  • azu