2016-10-11 7 views
0

私はJavascriptでdefinePropertiesを使用してオブジェクトの複数のプロパティを定義できることを学びました。私は下の簡単なコードで試してみましたが、私が望む結果を得るのは静かではありません。それはアクセサが動作していないと私はなぜわからないようです。JavaScriptオブジェクトdefinePropertiesが動作しない

var book = {}; 
Object.defineProperties(book,{ 
_year: { 
    value: 2004 }, 
edition: { 
    value: 1}, 
year: { 
    get: function(){ 
    this._year;}, 
    set: function(value){ 
    if(value>2004){ 
    this._year = value; 
    this.edition = this.edition + value - 2004; 
}); 
this.year = 2016; 
alert(book.edition); //1 why?? 
+0

あなただけI、はい – j08691

+0

'}'いくつかが欠けているように見えます私はそれらの閉じ括弧が不足していることを認識し、フォーマットスタイルはそれを明確にしませんでした。おかげで – Celaro

答えて

2

あなたはあなたのコードでは、複数のエラーを持っているが、主な問題は、あなたがvalueとプロパティを定義した場合、それが読み取り専用のデフォルトである、ということである:

MDN: Object.defineProperty

書き込み可能
trueプロパティに関連付けられた値が代入演算子で変更される場合のみ、
デフォルトはです。偽です。

これらのプロパティを書き込み可能にするには、writable: trueを追加する必要があります。

だからあなたのコードは、(あなたが持っていた他のすべてのエラーの訂正を含む)は、このように見えるように持っている:

var book = {}; 
 
Object.defineProperties(book, { 
 
    _year: { 
 
    value: 2004, 
 
    writable: true // << writable 
 
    }, 
 
    edition: { 
 
    value: 1, 
 
    writable: true // << writable 
 
    }, 
 
    year: { 
 
    get: function() { 
 
     // << missing return 
 
     return this._year; 
 
    }, 
 
    set: function(value) { 
 

 
     if (value > 2004) { 
 
     this._year = value; 
 
     this.edition = this.edition + value - 2004; 
 
     } 
 
    } 
 
    } 
 
}); 
 
book.year = 2016; // << here you used this instead of book 
 
console.log(book.edition);

+0

ありがとう、確かに私はちょうどその事実については、definePropertiesを使用して読んでいます。 Enumerable、Configurable、およびWritableは、デフォルトではfalseです。 – Celaro

+0

ゲッターの 'return'は必要ではないようです。 – j08691

+0

@ j08691実際には与えられたコードとは関係ありませんが、OPが' year'プロパティを別の場所で読み込もうとすると 'undefined'を返します。コードなので、この修正を追加情報として追加しました。そうでなければ、このゲッターはあまり意味がありません。 –

関連する問題