Skip to content

Instantly share code, notes, and snippets.

@jed
Created November 28, 2011 13:14
Show Gist options
  • Save jed/1400363 to your computer and use it in GitHub Desktop.
Save jed/1400363 to your computer and use it in GitHub Desktop.
an attempt to make the new operator dynamically invokeable
// usage: newOperator(constructor, [arg1, arg2, ...])
// example: newOperator(Date, [1995, 11, 24])
// => should be identical to new Date(1995, 11, 24)
function newOperator(constructor, args) {
var i = args.length + 1
, params = []
, fn
while (i--) params[i] = "$" + i
params.push("return new $0(" + params.slice(1) + ")")
fn = Function.apply(null, params)
params = params.concat.apply(constructor, args)
return fn.apply(null, params)
}
@jed
Copy link
Author

jed commented Nov 29, 2011

in that case, why define the array at all if args has no length? can we use this?

var length = args ? args.length + 1 : 0

[EDIT] so something like this:

function newOperator(ctor, args) {
  var length = args ? -~args.length : 0
    , fn = newOperator[length]

  fn || (fn = newOperator[length] = Function(
    "ctor", "args", "i",
    "return new ctor(" +
      Array(length).join(", args[i++]").slice(1) +
    ")"
  ))

  return fn(ctor, args, 0)
}

@WebReflection
Copy link

the minus tilde does not give us much more than +1, 2 readable chars with no necessary int cast.
I agree the creation of an empty Array per each call without arguments is way too redundant and also bigger than this solution:
d[c=b?b.length+1:1]
I have edited and as result 2 chars less and faster "no arguments" execution ;-)

@jed
Copy link
Author

jed commented Nov 29, 2011

doesn't leaving out the number cast mean that the length property could be used to inject code? i'm thinking where args is {length: "throw 'neener neener'"}.

@WebReflection
Copy link

well, the initial trick does not solve a thing here ... if you want to screw up functions that would work even with native arrays methods ...

@WebReflection
Copy link

uh .. wait, I know what you mean ... so yes, minus tilde then, updated :D

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment