Well-Known Symbols: Array item getter/setter
Proxies should be enough for this. Is there any reason not to use them?
One advantage of this approach is that more "spec magic" can be implemented in terms of the language - it would also make subclassed arrays more versatile instead of having to always be a Proxy.
- one will have to provide access to all
Array.prototype.methods
- proxies will be slower
- bad readability
On Apr 9, 2015, at 2:37 PM, Jordan Harband <ljharb at gmail.com> wrote:
One advantage of this approach is that more "spec magic" can be implemented in terms of the language - it would also make subclassed arrays more versatile instead of having to always be a Proxy.
see strawman:object_model_reformation, strawman:object_model_reformation
An alternative that was discussed at one point was to invert this idea:
-
Arrays get the methods that Maps already have:
get(index)
andset(index, value)
. Advantage: one could support negative indices. That is, the following two expressions would be equivalent.arr.get(-1) arr.get(arr.length-1)
-
Using brackets for accessing array elements is phased out.
That may be easier to achieve and would fit in well with ES6 collections.
( note: you can view this message as a gist @ gist.github.com/kosich/375da99403c76bc75bbd )
Currently we can imitate Arrays only with objects, where we would refer to a value at some position via referring to objects property ( with integer index being converted to a string )
var arr = { "0" : "zero", "1" : "one" }; arr[ 1 ];
But we wouldn't get all those features that original Array has (like length autoincremention, splice, split etc.)
So, the suggestion is to have WKS for getting and setting item in array by index.
get [ Symbol.Array.item ] ( index ){ /*returning code here*/ } set [ Symbol.Array.item ] ( index ){ /*setter code here*/ }
-or-
[ Symbol.Array.get ] ( index ){ /*returning code here*/ } [ Symbol.Array.set ] ( index ){ /*setter code here*/ }
Possible usecases
readonly array
will throw if user tries to set item directly via index
class ROArray extends Array { constructor( initialValues ){ // init the array values here } [ Symbol.Array.set ] ( index ){ throw 'can`t set'; } [ Symbol.Array.get ] ( index ){ return this[ index ]; } }
template-like behavior
items getter will wrap the value into a tag
class LITemplateArray extends Array { set tag ( tag ){ this._tag = tag; } [ Symbol.Array.get ] ( index ){ var tag = this._tag || 'li', value = this[ index ]; return `<${ tag }>${value}</${tag}>`; } }
/this is my first thread here, so I'm sorry if being wrong somewhere/ /after googling around, I haven't found such suggestion. though could easily miss that/