HTML and CSS Reference
In-Depth Information
ES3 objects are basically mutable collections of properties. The
Object.seal
method can be used to seal an entire object; all of the object's own properties
will have their
configurable
attribute set to
false
, and subsequently the
object's [[Extensible]] property is set to
false
. Using a browser that supports
Object.getOwnPropertyDescriptor
and
Object.defineProperty
,
the
seal
method could be implemented as in Listing 8.4.
Listing 8.4
Possible
Object.seal
implementation
if (!Object.seal && Object.getOwnPropertyNames &&
Object.getOwnPropertyDescriptor &&
Object.defineProperty && Object.preventExtensions) {
Object.seal = function (object) {
var properties = Object.getOwnPropertyNames(object);
var desc, prop;
for(vari=0,l=properties.length; i < l; i++) {
prop = properties[i];
desc = Object.getOwnPropertyDescriptor(object, prop);
if (desc.configurable) {
desc.configurable = false;
Object.defineProperty(object, prop, desc);
}
}
Object.preventExtensions(object);
return object;
};
}
We can check whether or not an object is sealed using
Object.isSealed
.
Notice how this example also uses
Object.getOwnPropertyNames
, which
returns the names of all the object's own properties, including those whose
enumerable
attribute is
false
. The similar method
Object.keys
returns the
property names of all enumerable properties of an object, exactly like the method
in Prototype.js does today.
To easily make an entire object immutable, we can use the related, but even more
restrictive function
Object.freeze
.
freeze
works like
seal
, and additionally
sets all the properties
writable
attributes to false, thus completely locking the
object down for modification.