Is there a way to get a get/set behaviour on an array? I imagine something like this:
var arr = ['one', 'two', 'three']; var _arr = new Array(); for (var i = 0; i < arr.length; i++) { arr[i].__defineGetter__('value', function (index) { //Do something return _arr[index]; }); arr[i].__defineSetter__('value', function (index, val) { //Do something _arr[index] = val; }); }
JavaScript Accessors (Getters and Setters)ECMAScript 5 (ES5 2009) introduced Getter and Setters. Getters and setters allow you to define Object Accessors (Computed Properties).
The get syntax binds an object property to a function that will be called when that property is looked up.
Getters and setters allow us to define Object Accessors. The difference between them is that the former is used to get the property from the object whereas the latter is used to set a property in an object.
In JavaScript, a setter can be used to execute a function whenever a specified property is attempted to be changed. Setters are most often used in conjunction with getters to create a type of pseudo-property. It is not possible to simultaneously have a setter on a property that holds an actual value.
Using Proxies, you can get the desired behavior:
var _arr = ['one', 'two', 'three']; var accessCount = 0; function doSomething() { accessCount++; } var arr = new Proxy(_arr, { get: function(target, name) { doSomething(); return target[name]; } }); function print(value) { document.querySelector('pre').textContent += value + '\n'; } print(accessCount); // 0 print(arr[0]); // 'one' print(arr[1]); // 'two' print(accessCount); // 2 print(arr.length); // 3 print(accessCount); // 3 print(arr.constructor); // 'function Array() { [native code] }'
<pre></pre>
The Proxy constructor will create an object wrapping our Array and use functions called traps to override basic behaviors. The get
function will be called for any property lookup, and doSomething()
before returning the value.
Proxies are an ES6 feature and are not supported in IE11 or lower. See browser compatibility list.
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With