I was trying out this really simple example from the awesome "Professional JavaScript for Web Developers" book by Nicholas Zakas but I can't figure what I am doing wrong here. Must be something really simple that I missed but I'm stuck.
Here is the code:
'use strict'; var book = {}; Object.defineProperties(book, { originYear: { value: 2004, writable: false }, _year: { value: 2004 }, edition: { value: 1 }, year : { get: function() { return this._year; }, set: function(newValue) { if(newValue > this.originYear) { this._year = newValue; this.edition += newValue - this.originYear; } } } }); console.log(book.edition); book.year = 2006; console.log(book.edition); The error I am getting on the Chrome console is:
Uncaught TypeError: Cannot assign to read only property '_year' of #main.js:31 Object.defineProperties.year.setmain.js:39 (anonymous function)
Can someone please explain where I have gone wrong?
Here is the fiddle
The readOnly property sets or returns whether a text field is read-only, or not. A read-only field cannot be modified. However, a user can tab to it, highlight it, and copy the text from it. Tip: To prevent the user from interacting with the field, use the disabled property instead.
The JavaScript strict mode-only exception "is read-only" occurs when a global variable or object property that was assigned to is a read-only property.
Sample Code: class C { readonly readOnlyProperty: string; constructor(raw: string) { this. process(raw); } process(raw: string) { this. readOnlyProperty = raw; // [ts] Cannot assign to 'readOnlyProperty' because it is a constant or a read-only property. } }
This JavaScript exception is read-only works in strict mode-only and It occurs if a global variable or object property which has assigned to a value, is a read-only property. Cause of Error: The global variable or object property that has assigned value is a read-only property.
When you use Object.defineProperties, by default writable is set to false, so _year and edition are actually read only properties.
Explicitly set them to writable: true:
_year: { value: 2004, writable: true }, edition: { value: 1, writable: true }, Check out MDN for this method.
writabletrueif and only if the value associated with the property may be changed with an assignment operator.
Defaults tofalse.
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With