> For the complete documentation index, see [llms.txt](https://lochiwei.gitbook.io/web/llms.txt). Markdown versions of documentation pages are available by appending `.md` to page URLs; this page is available as [Markdown](https://lochiwei.gitbook.io/web/js/val/builtin/proxy/ex/readonly.md).

# read-only proxy

[JS](/web/js.md) ⟩ [object](/web/js/val/obj.md) ⟩ [built-in](/web/js/val/builtin.md) ⟩ [Proxy](/web/js/val/builtin/proxy.md) ⟩ [example](/web/js/val/builtin/proxy/ex.md) ⟩ read-only proxy

{% hint style="success" %}
uses Proxy to create a read-only wrapper for an object.
{% endhint %}

{% tabs %}
{% tab title="💈範例" %}

* replit ⟩ [read-only proxy](https://replit.com/@pegasusroe/read-only-proxy#index.js)

```javascript
// make an object read-only
function readOnly(o) {
    
    // throw error when trying to set/add/delete property.
    function throwError() { 
        throw new TypeError(`proxy object is read-only.`); 
    } 
    
    // return proxy
    return new Proxy(o, {
        set           : throwError,    // can't set   : proxy[key]
        defineProperty: throwError,    // can't add   : proxy[key]
        deleteProperty: throwError,    // can't delete: proxy[key]
        setPrototypeOf: throwError,    // can't set   : proxy's prototype
    });
}

let o = { x: 1, y: 2 };    // normal writable object 
let p = readOnly(o);       // read-only version of it

p.x,    // 1
p.y,    // 2
p.z,    // undefined

p.x = 2,           // can't set p.x   : ⛔ [TypeError] proxy object is read-only.
delete p.y,        // can't delete p.y: ⛔ [TypeError] proxy object is read-only.
p.z = 3,           // can't add p.z   : ⛔ [TypeError] proxy object is read-only.
p.__proto__ = {},  // can't set proto : ⛔ [TypeError] proxy object is read-only.
```

{% endtab %}

{% tab title="📗 參考" %}

* [ ] JS.info ⟩ [Proxy and Reflect](https://javascript.info/proxy)
* [ ] [JavaScript: The Definitive Guide](/web/master/ref/javascript-the-definitive-guide.md) ⟩&#x20;
  * [ ] 14.6 The Reflect API
  * [ ] 14.7 Proxy Objects
    {% endtab %}

{% tab title="📘 手冊" %}

* [Proxy](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Proxy)
* [Reflect](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Reflect)
  {% endtab %}
  {% endtabs %}
