2016-08-09 6 views
0

ブック、プロフェッショナルのJavaScript®を起こし、こう述べています。再定義属性は、Web開発者の第三版のエラー

プロパティはDEFI不可能なとして定義された後さらに、それは が再び設定可能になることはできません。 Object.defineProperty()を呼び出し、書き込み可能な以外の属性を変更しようとすると、エラーが発生します。

'use strict'; 
 
var obj = {}; 
 
Object.defineProperty(obj, 'key', { 
 
    value:'static' 
 
}); 
 

 
Object.defineProperty(obj, 'key', { 
 
    writable: true, 
 
});

Iは、上記のコードを記述し、それはエラーをスロー。 この本では、書き込み可能な属性を再定義できると述べています。なぜそれはエラーを引き起こすのですか?

答えて

1

なぜエラーが発生しますか?

MDN says

は:

プロパティは設定不可能である場合は、そのwritable属性はfalseに変更することができます。

だから、本の中の文は十分に正確ではありません:あなたは、ラウンドされていない他の方法で、設定不可能性質上、だけtrueからfalsewritableを変更することができ、あなたがしようとしているものです。

0

Object.definePropertyのプロパティ記述子をスキップすると、代わりにいくつかのデフォルト値が使用されます。

Object.defineProperty(obj, 'key', { 
    value:'static', 
    writable: false 
}); 

明示的truewritableを設定し、再実行している場合:writable記述子の場合

は、デフォルト値は、最初の時間はこれと同じ効果があり、それを設定しないことを意味する、 falseですコードでは、例外がスローされないことがわかります。

+1

まあ、それは2番目の呼び出しで変更されていません。それは無駄だ。 –

+0

ああ、はい、それは本当です。しかし、問題の最初の例とは対照的に、最初の呼び出しで問題が発生していることがわかります。しかし、あなたは正しい。 –

1

属性は、configurable属性がtrueの場合にのみ、書き込み不可能から書き込み可能に変更できます。 (ECMA-262 7th ed。、§6.1.7.1)デフォルトではfalseです。

プロパティのメタデータを作成した後で構成する場合は、最初にdefinePropertyconfigurable: trueを追加します。公平を期すために、例外はありません `writable`が既に` true`のであればあるため

'use strict'; 
 
var obj = {}; 
 
Object.defineProperty(obj, 'key', { 
 
    value:'static', 
 
    configurable: true 
 
}); 
 

 
Object.defineProperty(obj, 'key', { 
 
    writable: true, 
 
}); 
 

 
console.log(Object.getOwnPropertyDescriptor(obj, 'key'));

関連する問題