Since the ECMA-262 specifications Javascript has gained the Object.freeze() method, which allows for objects, whose properties can not be changed, added or removed.
var obj = {'a':1, 'b:2'};
Object.freeze(obj);
Object.isFrozen(obj); // returns true
obj.a = 10; // new assignment has no affect
obj.a; // returns 1
So far so good.
I am wondering, whether freeze() should also work on Arrays.
var arr = [1, 2];
Object.freeze(arr);
Object.isFrozen(arr); // returns true
arr[0] = 10;
arr; // returns [10, 2] ... ouch!
Maybe I am wrong, but I was under the impression, that Array inherits from Object.
typeof obj // "object"
typeof arr // "object"
Any ideas, pointers, enlightenments would be highly appreciated.
Yes, freeze should work for Arrays, the behavior you are experiencing is clearly an implementation bug.
This bug might be related to the fact that array objects implement a custom
[[DefineOwnProperty]]internal method (the magic that makes thelengthproperty work).I just tested it on two implementations and it works properly (Chrome 16.0.888, and Firefox Aurora 8.02a).
About your second question, well, array objects inherit from
Array.prototypewhich inherits fromObject.prototype, for example, you can access non shadowed methods fromObject.prototypedirectly on array objects:But this isn’t related about how the
typeofworks, this operator will return'object'for any object intance, regardless its kind, and for thenullvalue, which people has always complained about.The rest of possible return values of the
typeofoperator, correspond to the primitive types of the language, Number, String, Boolean, Symbol and Undefined.