In JavaScript, there are different ways to define properties to objects.
For example, if we have a Customer class, we can define properties using the this keyword, and also Object.defineproperty:
function Customer (firstname, lastname, email, phonenumber) { this.firstname = firstname, this.lastname = lastname, this.email = email, Object.defineProperty(this, "phonenumber", { writable: true, enumerable: true, configurable: false, value: phonenumber }); } //Print out Customer var Customer00001 = new Customer("Bob", "Smith", "bob@test.com", "111-222-7777") console.log(Customer00001);
Running this produces:
With Object.defineProperty, we can be more granular with the property, setting:
- writable
- emumerable
- configurable
- value
With writable, consider the code where we update the phone number:
function Customer (firstname, lastname, email, phonenumber) { this.firstname = firstname, this.lastname = lastname, this.email = email, Object.defineProperty(this, "phonenumber", { writable: true, enumerable: true, configurable: false, value: phonenumber }); } //Print out Customer var Customer00001 = new Customer("Bob", "Smith", "bob@test.com", "111-222-7777") Customer00001.phonenumber = "Updated: 222-111-4455"; console.log(Customer00001);
This produces:
However, with writable: false, the updated phone number would not be written to the object. If we have strict mode turned on, we would see “Uncaught TypeError: Cannot assign to read only property”:
If we set enumerable: false,
function Customer (firstname, lastname, email, phonenumber) { this.firstname = firstname, this.lastname = lastname, this.email = email, Object.defineProperty(this, "phonenumber", { writable: true, enumerable: false, configurable: false, value: phonenumber }); } //Print out Customer var Customer00001 = new Customer("Bob", "Smith", "bob@test.com", "111-222-7777") for (var i in Customer00001) { console.log(Customer00001[i]); }
This produces below, with the phone number not displayed:
Now with enumerable: false. Let’s say we set this to false, if we try to change another property, we will receive an error “Cannot redefine property”:
function Customer (firstname, lastname, email, phonenumber) { this.firstname = firstname, this.lastname = lastname, this.email = email, Object.defineProperty(this, "phonenumber", { writable: true, enumerable: true, configurable: false, value: phonenumber }); } //Print out Customer var Customer00001 = new Customer("Bob", "Smith", "bob@test.com", "111-222-7777") Object.defineProperty(Customer00001, "phonenumber", {enumerable: false});
You can also use Object.defineProperties to define multiple properties at once:
function Customer (firstname, lastname, email, phonenumber, website) { this.firstname = firstname, this.lastname = lastname, this.email = email, Object.defineProperties(this, { "phonenumber": { writable: true, enumerable: true, configurable: true, value: phonenumber }, "website": { writable: true, enumerable: true, configurable: true, value: website }}); } //Print out Customer var Customer00001 = new Customer("Bob", "Smith", "bob@test.com", "111-222-7777", "www.test.com"); console.log(Customer00001);
This displays:
I AM SPENDING MORE TIME THESE DAYS CREATING YOUTUBE VIDEOS TO HELP PEOPLE LEARN THE MICROSOFT POWER PLATFORM.
IF YOU WOULD LIKE TO SEE HOW I BUILD APPS, OR FIND SOMETHING USEFUL READING MY BLOG, I WOULD REALLY APPRECIATE YOU SUBSCRIBING TO MY YOUTUBE CHANNEL.
THANK YOU, AND LET'S KEEP LEARNING TOGETHER.
CARL