3
function Player(name)
    {            
        this._name = name;                     
        this._id = "Player"+(Player_ID++);
    };

var newPlayer = new Player(newUnitName);
alert(JSON.stringify(newPlayer));

What I want to do is stop displaying the id value. Is there a way to make the id variable tranient. Please help

1

3 Answers 3

5

Every object has a method toJSON(), which is invoked when the object should be serialize using JSON.stringify().

From MDN article on JSON.stringify():

If an object being stringified has a property named toJSON whose value is a function, then the toJSON() method customizes JSON stringification behavior: instead of the object being serialized, the value returned by the toJSON() method when called will be serialized


The following example creates a different serialization function, which will exclude the _id:

var Player_ID = 0;
function Player(name) {            
 this._name = name;                     
 this._id = "Player"+(Player_ID++);
 this.toJSON = function() {
   return {
     _name: this._name
   };
 };
};

var newPlayer = new Player('Name 1');
console.log(JSON.stringify(newPlayer)); // prints {"_name": 'Name 1'}

Check the working demo.

Sign up to request clarification or add additional context in comments.

Comments

1

If you don't need to enumerate over this property you can use non-enumerable properties:

    function Player(name)
        {            
            this._name = name;                     
            Object.defineProperty(this, '_id', {
              enumerable: false
            });
        };

    var newUnitName = "Foo";
    var newPlayer = new Player(newUnitName);
    alert(JSON.stringify(newPlayer));

1 Comment

How we can access console.log(newPlayer._id)?
1

Targeting ES2022, you can achieve transient variables at least in 2 ways:

  1. Using a private variable
  2. Using an "accessor" variable
"use strict";
class Example {
    constructor() {
        this.#aTransientValue_accessor_storage = "transient";
        this.aNormalValue = "public";
        this.#aPrivateValue = "public";
    }
    #aTransientValue_accessor_storage;
    get aTransientValue() { return this.#aTransientValue_accessor_storage; }
    set aTransientValue(value) { this.#aTransientValue_accessor_storage = value; }
    #aPrivateValue;
}
const example = new Example();
console.log(example); /// prints { "aNormalValue": "public" }

Typescript even introduced the "accessor" keyword, which can be used for this purpose.

Here is the TS equivalent code:

class Example {
    accessor aTransientValue = "transient";
    public aNormalValue = "public"
    #aPrivateValue = "public"
}

const example = new Example();

console.log(example);

Comments

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge you have read our privacy policy.

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.