Edit in JSFiddle

var book = {
  _year: 2018,
  edition: 1
};
// _year 의 값을 직접 쓸수 없게 함
Object.defineProperty(book, "_year", {
  writable: false
});

// year 프로퍼티를 생성하여 _year의 속성에 접근
Object.defineProperty(book, "year", {
  get: function() {
    return this._year; // _year의 값을 반환.
  },
  set: function(newValue) {
    if (newValue > 2018) { // 저장하려는 값이 2018보다 커야 저장.
      // this._year = newValue; 이런식으로 직접변경이 안됨 
      // defineProperty 메서드를 사용해서 변경
      Object.defineProperty(this, "_year", {
        value: newValue
      });
      this.edition += newValue - 2018; // 올바른 edition을 반환하기 위해 약간 계산.
    }
  }
});

book.year = 2020; // edition의 값도 같이 변경됨
document.write(book.year + "<br>"); // 2020
document.write(book.edition + "<br>"); // 3