2017-05-24 7 views
-1

オブジェクトがbookである以下の最初のコードでは、最初にbook.year2013に設定されています。私がbook.year = 2015を割り当てて、book.yearを実行して再び値を取得しようとしたとき、私は2015の代わりに2013を得ます。私はどこで間違っているのですか?Object.defineProperties() - 定義後に新しい値をプロパティに割り当てる

コードを以下に与えられる:

予想通り対照的に、 book2.yearの値を取得しようとしたときに下記のコードの他の同等の部分に、 book2.year = 2013を割り当てた後、出力 2013を与え、一方

var book = {}; 
Object.defineProperties(book, { 
    _yearOrigin: { 
     value: 2013 
    }, 
    edition: { 
     value: "1st" 
    }, 
    year: { 
     get: function(){return this._yearOrigin}, 

     set: function(newValue){ 
      //assigning this._yearOrigin 
      this._yearOrigin = newValue; 

      //carrying the operation for evaluating the `subscript` to add in this.edition 
      //diff = difference in year 
      var diff = String(newValue - 2013); 
      var diffLast2ndChar = diff.charAt(diff.length - 2); 
      var diffLastChar = diff.charAt(diff.length - 1); 
      var subscript = ""; 

      if (diff.length > 1 && diffLast2ndChar == "1") { 
       subscript = "th"; 
      } else { 
       subscript = diffLastChar == "1" 
           ? "st" 
           : diffLastChar == "2" 
            ? "nd" 
            : diffLastChar == "3" 
             ? "rd" 
             : "th" ; 
      } 
      //--end of subscript evaluation 

      //assigment operation of this.edition 
      var rawEdition = Number(this.edition.charAt(0)) + Number(diff); 
      this.edition = String(rawEdition) + subscript; 
     } 
    } 
}); 

>>> book.year = 2015 
>>>book.year //output is 2013 , but expected output is 2015 

var book2 = { 
    _year: 2004, 
    edition: 1 
}; 
Object.defineProperty(book2, "year", { 
    get: function(){ 
     return this._year; 
    }, 
    set: function(newValue){ 
     if (newValue > 2004) { 
      this._year = newValue; 
      this.edition += newValue - 2004; 
     } 
    } 
}); 

book2.year = 2005; 
console.log(book2.year); //2005 (Now this time the output is expected unlike in the previous code shown above) 
+2

を飛び出し値。 [value](https://developer.mozilla.org/en/docs/Web/JavaScript/Reference/Global_Objects/Object/defineProperties)パラメータのみを与えるため、不変の値として扱われます。 2番目のバージョンでは、オブジェクトにプロパティを定義します。デフォルト値は「2004」です。そこに大きな違いがあります – Icepickle

+2

'_yearOrigin'のような' value'で 'defineProperties()'によって作成されたプロパティはデフォルトで非[[writable']になります(https://developer.mozilla.org/en- US/docs/Web/JavaScript/Reference/Global_Objects/Object/defineProperties)(不変)。 –

+0

@Icepickle @Jonathan私は何をしなければならないでしょうか? 'writable:true'や何か他のものを指定する必要がありますか? – Neel

答えて

0

私は、オブジェクトのプロパティを定義するためにObject.Property/Object.propertiesを使用した場合、falsewritableデフォルト」という事実のために私を見下ろしました。 e、定義された値は変更することはできません(書き込み不可能) "というコメントセクションの人に言及されました。

下図のように、私はwritable = trueを追加したときに、その問題が解決してしまったと予想される結果は、あなたが定数として `2013`にご` _yearOrigin`の値を設定している最初の部分では

_yearOrigin: { 
    value: 2013, 
    writable: true 
}, 
+1

という言葉を言いますが、これは今あなたのコードのどの部分からでも設定できることを意味しています。つまり、コード全体で、_yearOriginが実際に起源であるかどうか、または別のセッターでのチェックを行わずに設定されていることを確認できなくなります – Icepickle

関連する問題