Extending an Object by Defining a New Property
Problem
You can easily slap a new property onto an object, but you want to do so in such a way that you have more control of how it’s used.
Solution
Use the defineProperty() method to add the property.
Given the following object:
var data = {}
If you want to add the following two properties with the given characteristics: • type: Initial value set and can’t be changed, can’t be deleted or modified, but can be enumerated • id: Initial value set, but can be changed, can’t be deleted or modified, and can’t be enumerated Use the following JavaScript:
var data = {}; Object.defineProperty(data, 'type', { value: 'primary', enumerable: true }); console.log(data.type); // primary data.type = 'secondary'; console.log(data.type); // nope, still primary Object.defineProperty(data, 'id', { value: 1, writable: true }); console.log(data.id); // 1 data.id=300; console.log(data.id); // 300 for (prop in data) { console.log(prop); // only type displays }
EXPLAIN
The defineProperty() is a way of adding a property to an object other than direct assignment that gives us some control over its behavior and state. There are two varia‐ tions of property you can create with defineProperty(): a data descriptor, as demon‐ strated in the solution, and an accessor descriptor, defined with a getter-setter function pair. An example of an accessor descriptor is the following:
var data = {}; var group = 'history'; Object.defineProperty(data, "category", { get: function () { return group; }, set: function (value) { group = value; }, enumerable: true, configurable: true }); console.log(data.category); // history group = 'math'; console.log(data.category); // math data.category = 'spanish'; console.log(data.category); // spanish console.log(group); // spanish
Changes to the value for data.category and group are now interconnected.
The Object.defineProperty() supports three parameters: the object, the property, and a descriptor object. The latter consists of the following options:
• configurable: false by default; controls whether the property descriptor can be changed
• enumerable: false by default; controls whether the property can be enumerated
• writable: false by default; controls whether the property value can be changed through assignment
• value: The initial value for the property
• get: undefined by default; property getter
• set: undefined by default; property setter The defineProperty() method has wide support in all modern browsers, but with caveats. Safari does not allow its use on a DOM object, while IE8 only supports it on a DOM object (IE9 and later support it on all objects).
No comments:
Post a Comment