If I try this using standard Javascript instead of __defineGetter__, I get a more descriptive error when it fails (in Node only):
> Object.defineProperty(f, 'length', { get: function() { return 5; } });
TypeError: Cannot redefine property: length
And digging deeper:
> Object.getOwnPropertyDescriptor(f, 'length')
{ value: 3,
writable: false,
enumerable: false,
configurable: false }
Looks like the version of V8 Node is using defines length as a non-configurable property. In Chrome the same function says "configurable: true", so that behavior must have changed.
That being said, anything I've ever used which used the length of a function always causes headaches... various function composition functions, such as .bind will, depending on the version of V8 or Javascript engine (or other 3rd party modules which polyfill over the standard .bind) will often return a misleading result (on older versions of V8, and most polyfills, (function(a,b) {}).bind().length would be 0 instead of 2, since the return function isn't declared with any parameters).
Jimb Esser