Array.prototype[0] setter

# felix (14 years ago)

If I define a setter for Array.prototype[0], does [].push invoke that setter?

Test code:

<!doctype html><html><body> <script> Object.defineProperty( Array.prototype, 0, { get : function() { alert('get 0'); return this.zero; }, set : function(v) { alert('set 0 ' + v); this.zero = v; }, enumerable : true, configurable : false }); var a = []; alert('before push a[0] = ' + a[0]); a.push(44); alert('after push a[0] = ' + a[0]); </script> </body></html>

On all the browsers I've tried so far, the setter doesn't get invoked.

However, it looks to me like the ES5.1 spec says the setter should get invoked:

15.4.4.7 says push() invokes the [[Put]] internal method

8.12.5 says [[Put]] tries to use an inherited property descriptor if there isn't an own property descriptor.

# Allen Wirfs-Brock (14 years ago)

On Oct 18, 2011, at 12:31 PM, felix wrote:

If I define a setter for Array.prototype[0], does [].push invoke that setter?

It's supposed to.

Test code:

<!doctype html><html><body> <script> Object.defineProperty( Array.prototype, 0, { get : function() { alert('get 0'); return this.zero; }, set : function(v) { alert('set 0 ' + v); this.zero = v; }, enumerable : true, configurable : false }); var a = []; alert('before push a[0] = ' + a[0]); a.push(44); alert('after push a[0] = ' + a[0]); </script> </body></html>

On all the browsers I've tried so far, the setter doesn't get invoked.

However, it looks to me like the ES5.1 spec says the setter should get invoked:

Yes, that is what it says and it is intentional.

# David Bruant (14 years ago)

Are there tests for this?

David

Le 18/10/2011 21:37, Allen Wirfs-Brock a écrit :

# Andrea Giammarchi (14 years ago)

In webkit nightly not even the getter gets invoked.

# Andrea Giammarchi (14 years ago)

however, push does invoke [[Put]] but only in non array objects.

var a = {}; Object.defineProperty( a, "0", { get : function() { alert('get 0'); return this.zero; }, set : function(v) { alert('set 0 ' + v); this.zero = v; }, enumerable : true, configurable : false }); a.length = 0; a.push = [].push; alert('before push a[0] = ' + a[0]); a.push(44); alert('after push a[0] = ' + a[0]);