Versions Compared

Key

  • This line was added.
  • This line was removed.
  • Formatting was changed.
Excerpt

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...

 

Syntax

Code Block
themeRDark
languagejavascript
linenumberstrue
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
obj.addProp(mask, key, val_get, set);

Where obj is any object in the Javascript environment.

Parameters

ParameterTypeMandatoryDescriptionUtil.js version
nMaskmaskNumber constant(tick)

A constant describing the property and its flagsdescriptor settings:

Child pages (Children Display)
alltrue
depthall
excerpttrue

1.0.1
sKeykeyString(tick)The name (key) of the property as a string.1.0.1
vValval_fGetget

Value or

Function

(tick)

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.

1.0.1
fSetsetFunction(question)(error)

If you're defining an accessor property (getter/setter) then this parameter is the setter function

(or null if you're property

.

If your accessor is read-only

)

, you don't need to specify a setter function.

1.0.1

Return value

Returns whatever Javascript's defineProperty method returns, or throws an error.

Example

Code Block
themeRDark
languagejavascript
titleAdd .isAlly, .isEnemy and .isMe properties to player data objectsPlayer Obejcts
linenumberstrue
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 https://warzone.atlassian.net/wiki/display/EGG/Function+Manipulation
// For info on curry() and wraps()
 
var isAlly = allianceExistsBetween.curry(me);
 
var NOT = funciton(bool) {
	return !bool;
}
 
var isEnemy = NOT.wraps(isAlly);

// Iterate the playerData array and add properties to objects
 
playerData.forEach(function(player, id) {
	// using .addAccessor() would be more concise
	playerData[id].addProp(
		ACCESSOR_HIDDEN,
		"isAlly",
		isAlly.curry(id)
	);
	playerData[id].addProp(
		ACCESSOR_HIDDEN,
		"isEnemy",
		isEnemy.curry(id)
	);
	// using .addConst() would be more concise
	playerData[id].addProp(
		DATA_HIDDEN_READONLY,
		"isMe",
		(id == me)
	);
});
 
playerData[somePlayer].isAlly; // true or false
// etc...
Div
classbox
Availability

This feature requires:

  • Util.js v0.1 and above
  • Available on the global object/scope
    Status
    colourGreen
    titleStable

    Requires:

    Div
    classbox
    Contents

    Jump to:

    Table of Contents
    maxLevel5

    Div
    classbox

    Property Definitions

    Topics:

    Child pages (Children Display)
    alltrue
    depthall
    pageProperty Definitions
    excerpttrue

    Div
    classbox

    See also

    Related articles:

    • 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-definedMozilla Developer Network page that inspired this .addProp() function