オブジェクトがbook
である以下の最初のコードでは、最初にbook.year
が2013
に設定されています。私が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)
を飛び出し値。 [value](https://developer.mozilla.org/en/docs/Web/JavaScript/Reference/Global_Objects/Object/defineProperties)パラメータのみを与えるため、不変の値として扱われます。 2番目のバージョンでは、オブジェクトにプロパティを定義します。デフォルト値は「2004」です。そこに大きな違いがあります – Icepickle
'_yearOrigin'のような' value'で 'defineProperties()'によって作成されたプロパティはデフォルトで非[[writable']になります(https://developer.mozilla.org/en- US/docs/Web/JavaScript/Reference/Global_Objects/Object/defineProperties)(不変)。 –
@Icepickle @Jonathan私は何をしなければならないでしょうか? 'writable:true'や何か他のものを指定する必要がありますか? – Neel