Question on Setters

A question on a test I took: Is there anything wrong with setter method in the example below? If so, what?

let tempObj = {
_num: 22,
set num(numIn) {
_num = numIn;
}
};

Answer:

let tempObj = {
_num: 22,
set num(numIn) {
this._num = numIn;
}
};

Why do I have to use this._numIn?

Wouldn’t it know _num because of scope?

When in doubt, I write code to test it, like in this pen.

let tempObj1 = {
  _num: 22,
  set num(numIn) {
    console.log('tempObj1 this = ', this)
    console.log('tempObj1 this._num = ', this)
    this._num = numIn
  },
  get num() {
    return this._num
  }
}

let tempObj2 = {
  _num: 22,
  set num(numIn) {
    console.log('tempObj2 this = ', this)
    console.log('tempObj2 _num = ', _num)
    _num = numIn
  },
  get num() {
    return _num
  }
}

tempObj1.num = 123
console.log('final tempObj1.num =', tempObj1.num)
tempObj2.num = 456
console.log('final tempObj2.num =', tempObj2.num)

It fails on the second one, “Uncaught ReferenceError: _num is not defined”.

This is because this can be kind of squirrelly and works a little differently on object methods. From MDN, “When a function is called as a method of an object, its this is set to the object the method is called on.

So, this in this case is not the scope, but the object itself - it is how you refer to properties on the object. If you just refer to _num, it looks in the current scope and cannot find a variable with that name. In theory you could have a variable (a global for example) with that name and it would refer to that. To make sure you are talking about the property on that object, you must use this.

1 Like

Thank you so much. I see what I was getting mixed up on now!