ES Proxy for `Object.freeze(object)`.
Clone or download
Fetching latest commit…
Cannot retrieve the latest commit at this time.
Permalink
Type Name Latest commit message Commit time
Failed to load latest commit information.
src
test
.gitignore
.travis.yml
LICENSE
README.md
package.json
tsconfig.json

README.md

proxy-frozen-object Build Status

ES Proxy for Object.freeze(object).

Following proxy does not work correctly, proxy-frozen-object provide workaround.

// DOES NOT WORK CORRECTLY
const proxied = new Proxy(Object.freeze(object), { ... });

Why this library is needed?

ES Proxy can not proxy frozen object directly.

Following example throw an TypeError.

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 this library proxy myObject indirectly.

Following example 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!"

proxy-frozen-object do proxy the target indirectly.

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