2016-10-13 1 views
0

アクセサでプロパティを定義しようとするとエラーが発生します。無効なプロパティ記述子:ここに私のコードJavascriptが設定され、メソッドがエラーになる

 
    var person = {}; 

    Object.defineProperty(person, 'birthYear', { 
     value: 1997, 
     writable: true, 
     enumerable: true, 
     configurable: false, 
     set: function (value) { 
      this.birthYear = value; 
     }, 
     get: function() { 
      return 'Birth year - ' + this.birthYear; 
     } 
    }); 

    console.log(person.birthYear); 

エラーテキストです。アクセサーと値または書き込み可能な属性の両方を指定することはできません。

私が定義し、このようなメソッドを得ることができない場合、私はそれを行うことができますか?エラーメッセージで

+2

あなたは 'value'を削除しますが、' this.birthYear'を取得する 'birthYear'ゲッタは無限再帰を作成するので、このgetterは必要ありません。別のプロパティ名やシンボル、変数など、別の場所に値を格納する必要があります。 –

+0

[prototype](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Object/prototype)の代わりに1つのオブジェクトにプロパティを定義する理由はありますか –

+0

...とFYIでは、 'Object.create'を使ってオブジェクト作成/定義を1ステップで行うことができます。 –

答えて

5

ルック:

は、両方のアクセサと値または書き込み可能な属性を指定することはできません。

書き込みしようとしたときに何が起こるかを明示的に述べると、プロパティが書き込み可能かどうかは分かりません。

ので、削除します。そして、あなたが買ってあげる

value: 1997, 

writable: true, 

をそして、あなたはそれをあなたがそれを読んだときに値を動的に計算された値を、与えるので、削除することはできません。 person.birthYearを読み込もうとするたびに、ゲッター関数がperson.birthYearを読み込もうとするため、再帰に関するエラーが発生します。

他の場所に値を保存してください。

var person = { _birthYear: 1997 }; 

Object.defineProperty(person, 'birthYear', { 
    enumerable: true, 
    configurable: false, 
    set: function (value) { 
     this._birthYear = value; 
    }, 
    get: function() { 
     return 'Birth year - ' + this._birthYear; 
    } 
}); 

console.log(person.birthYear); 
関連する問題