3


JavaScript オブジェクトのプロパティを定義する必要があります。
var obj = {};
obj['prop1'] = 1


上記の方法で、プロパティを定義できます。 さて、これを別の方法で
使用しましょう。2つの違いは何ですか?プロパティが既に定義されているかどう かを確認しますか?? プロパティのおかげでチェックする と思います:)編集それらの間にパフォーマンスの変動はありますか?Object.defineProperty
var obj = {}; Object.defineProperty(obj,'prop1',{value:1});



Object.defineProperty
obj['prop1'] = 1



4

3 に答える 3

7

オブジェクトに直接アクセスすることも、既存のプロパティObject.definePropertyを「チェック」することもありません。これら2つの違いは、プロパティ記述子の値を変更できることだけです。

プロパティ記述子は

  • 列挙可能
  • 構成可能
  • 書き込み可能

これらはすべて、直接プロパティアクセスtrueを使用して設定されます。これらのプロパティを個別に設定するオプションがあります。このMDNアーティクルを読んで、意味を理解することをお勧めします。Object.defineProperty

たとえば、プロパティがフラグを所有している場合、フラグconfigurable=falseを上書きまたは削除することはできません(これは問題の場合です)。


パフォーマンスに関して:

は毎回実行する必要がある関数であるためObject.defineProperty、オブジェクトへの直接アクセスよりも低速である必要があります。私はこの小さなベンチマークを作成しました:

http://jsperf.com/property-access-with-defineproperty

ただし、違いが大きく見えても、の値と理由を忘れないでくださいObject.defineProperty

于 2012-12-03T10:36:07.563 に答える
1

どちらの場合も、プロパティが存在する場合はその値が上書きされ、存在しない場合は作成されます

于 2012-12-03T10:39:26.743 に答える
1

Mozillaは言う

プロパティがすでに存在する場合、Object.defineProperty()は、記述子の値とオブジェクトの現在の構成に従ってプロパティを変更しようとします。古い記述子の構成可能な属性がfalseに設定されている場合(プロパティは「構成不可能」と呼ばれます)、書き込み可能以外の属性は変更できません。その場合、データとアクセサのプロパティタイプを切り替えることもできません。

プロパティが構成不可能な場合、その書き込み可能な属性はfalseにのみ変更できます。

現在の値と新しい値が同じでない限り、構成不可能なプロパティ属性(書き込み可能な属性以外)を変更しようとすると、TypeErrorがスローされます。

于 2012-12-03T10:37:00.493 に答える