Overview
Adds a new accessor (getter/setter) or data (value) property to any object along with setting it's enumerable, configurable and read-only flags as desired...Availability
util.js v0.1 and above
Syntax
try { oObj.uAddProperty(nMask,sKey,vVal_fGet,fSet); } catch(e) { // likely a TypeError if an existing non-configurable property of the same sKey is defined }
Where oObj is any object in the Javascript environment.
Parameters
Parameter | Type | Mandatory | Description | Util.js version |
---|---|---|---|---|
nMask | Number constant | A constant describing the property and its flags: | 0.1 | |
sKey | String | The name (key) of the property as a string. | 0.1 | |
vVal_fGet | Value or Function | If you're defining a data property, this parameter can be any Javascript value, function or object, etc. If you're defining an accessor property (getter/setter) then this parameter is the getter function. | 0.1 | |
fSet | Function | If you're defining an accessor property (getter/setter) then this parameter is the setter function (or null if you're property is read-only). | 0.1 |
Return value
Returns whatever Javascript's defineProperty method returns, or throws an error.
Example
Add .isAlly, .isEnemy and .isMe properties to player data objects
playerData.primaryTarget = null; for (var p=0; p<playerData.length; p++) { // Add a hidden and read-only .id property that returns the player number playerData[p].uAddProperty( DATA_READONLY_HIDDEN, "id", p ); // Add a read-only .isAlly property that returns true if this player is an ally // Note: No setter function (fSet) means read only playerData[p].uAddProperty( ACCESSOR_NORMAL, "isAlly", allianceExistsBetween.uCurry(me,p) ); // Add a read-only .isMe property that returns true if this player is me playerData[p].uAddProperty( ACCESSOR_NORMAL, "isMe", function() { return (this.id==me); } ); // Add a read-only .isEnemy property that returns true if this player is an enemy playerData[p].uAddProperty( ACCESSOR_NORMAL, "isEnemy", function() { return (!(this.isAlly || this.isMe)); } ); // Add a read-write .isPrimaryTarget boolean property playerData[p].uAddProperty( ACCESSOR_NORMAL, "isPrimaryTarget", function() { return (playerData.primaryTarget == this.id); }, function(bool) { playerData.primaryTarget = (!!bool) ? this.id : null; return (!!bool); } ); }
See also
- defineProperty – I based uAddProperty on code examples from this MDN page
- TypeError – this will be thrown if an existing non-configurable sKey property exists on the object
- Function.uCurry() – create a new function that's based on an existing function but with some parameters pre-defined