Skip to content

azu/proxy-frozen-object

Folders and files

NameName
Last commit message
Last commit date

Latest commit

 

History

10 Commits
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 

Repository files navigation

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

About

ES Proxy for `Object.freeze(object)`.

Topics

Resources

License

Code of conduct

Security policy

Stars

Watchers

Forks

Sponsor this project

 

Packages

No packages published