An alternative to a writable 'length' property, is to make it configurable and nonwritable. It would prevent the issue of accidental assignments to the 'length' property that used be ignored in non-strict mode (they'll still be ignored), but it would allow to modify its value using Object.defineProperty.
—Claude Le 25 févr. 2013 à 07:27, Nathan Wall <nathan.w...@live.com> a écrit : > Would it be possible to make / what are the thoughts on making `length` > mutable on functions? > > Writing to `length` could be a useful functionality for library code. For > instance, implementing something like `bind` correctly requires the arity of > the bound function to be the same as the original function minus the number > of preloaded arguments. > > Simplified example: > > var slice = Function.prototype.call.bind(Array.prototype.slice); > function bind(f, thisArg, ...args) { > function bound() { > return f.apply(thisArg, args.concat(slice(arguments))); > } > var L = f.length - args.length; > bound.length = L > 0 ? L : 0; > return bound; > } > > Of course, `bind` is already on Function.prototype, so an ES6 library has no > need to implement it. I'm only using bind as an example to establish > precedent that writable `length` could be useful in implementing function > wrappers. Consider as a more necessary example implementing an `uncurryThis` > function. > > var uncurryThis = Function.prototype.bind.bind(Function.prototype.call); > function foo(a, b, c) { /* ... */ } > var uFoo = uncurryThis(foo); > console.log( > foo.length, // => 3 > uFoo.length // => 1 > ); > > This is problematic because we lose information about the arity of the `uFoo` > function which actually takes 4 arguments now: A `this` argument, `a`, `b`, > and `c`. A simple solution would be to write an uncurryThis which corrects > the arity: > > var bind = Function.prototype.call.bind(Function.prototype.bind), > callMethod = Function.prototype.call; > function uncurryThis(fn) { > var F = bind(callMethod, fn); > // Correct arity. > F.length = fn.length + 1; > return F; > } > function foo(a, b, c) { /* ... */ } > var uFoo = uncurryThis(foo); > console.log( > foo.length, // => 3 > uFoo.length // => 4 > ); > > Currently I have resorted to an `eval` based solution for creating wrapper > functions which are defined with the correct number of arguments when a > certain arity is desired. Obviously this is not ideal. Writable `length` > would help a lot. > > Thoughts? > > Nathan > _______________________________________________ > es-discuss mailing list > es-discuss@mozilla.org > https://mail.mozilla.org/listinfo/es-discuss _______________________________________________ es-discuss mailing list es-discuss@mozilla.org https://mail.mozilla.org/listinfo/es-discuss