Search code examples
javascriptarraysmonkeypatching

Can a Javascript Array or Object be overridden to be callable?


I want to figure out if Array[] and Object[] can be replaced by Array() and Object(). Can a function prototype be stuck into arrays or objects prototype chain to make them callable. Basically I am looking for some thing like this:

// some magic with prototypes
????????????????

a = [1, 3, 4]
b = [1, 3, 4]

console.log(a[1]) // prints 3
console.log(b(1)) // prints 3

a[0] = -1
// same as
b(0, -1)

console.log(a[1], b(1)) // prints -1 -1

Thanks alot!


Solution

  • You probably don't want to do this, especially in any browser. This doesn't have a lot of nice features of Array, including efficiency. That said:

    function ArrayFunction (arr) {
      var f = function s (p, v) {
        if (v !== undefined) {
          s[p] = v
        }
        return s[p]
      }
    
      for (var i = 0; i < arr.length; i++) {
        f[i] = arr[i]
      }
    
      return f
    }
    
    var a = new ArrayFunction([1, 3, 4])
    var b = new ArrayFunction([1, 3, 4])
    
    b(1, 5)
    a[1] //3
    b[1] //5
    

    I originally wanted to use prototypes, but objects don't inherit callableness from their prototypes.

    EDIT: Fixed above to not use arguments. This version does not allow you to set a value to undefined, but that's generally not considered a good practice anyway.