Hacker Newsnew | past | comments | ask | show | jobs | submitlogin

(Library author here.) Unfortunately, in JavaScript it's not possible to override array element reassignment behavior. You can call Object.freeze on the array, which makes reassignment silently do nothing, but you cannot override it to throw an exception.

The reason the docs say "the methods that would normally mutate..." is that in the specific case of methods (e.g. array.push()), the library can and does override them to throw exceptions.

I would certainly prefer to make that example throw an exception, but it's simply not possible in JS. :)



Object.freeze will throw if you `'use strict';`.


Very true...I should note that in the documentation. Thanks!


You can define a setter that throws in order to throw without using 'use strict;'. However, additions will still be silent :(

https://gist.github.com/vjeux/6b390e6a6bb51e24b646

    __DEV__ = true;
    var array = ['a', 'b', 'c']
    deepFreezeAndThrowOnMutationInDev(array)
    array[0] = 10;
    Error: You attempted to set the key `0` with the value `10` on an object that is meant to be immutable and has been frozen.


Thanks for sharing that tidbit of information. I did not know that and now I do, I appreciate it!

I wonder what the reason behind that is, if you're feeling extra motivated you could even look into having a conversation with the folks who decide what future versions of JS look like to add something like it. I am a huge proponent of immutability and can see how being able to override array element assignment behaviors would improve your library.


    Object.defineProperty(x,'foo',{set:function() { throw new Error(69) }})




Guidelines | FAQ | Lists | API | Security | Legal | Apply to YC | Contact

Search: