diff options
author | Masahiro FUJIMOTO <mfujimot@gmail.com> | 2021-09-19 00:03:57 +0900 |
---|---|---|
committer | Masahiro FUJIMOTO <mfujimot@gmail.com> | 2021-09-30 00:03:14 +0900 |
commit | 05e934e46e9be8a20ce3a15ba35d49ec1cdb5a21 (patch) | |
tree | 984e55a363dedb785242e6b6456349bc2c9e4917 /files/ja/web/javascript/reference/global_objects | |
parent | 215f43dc2fbff76add663e3db8b5d50f9d681122 (diff) | |
download | translated-content-05e934e46e9be8a20ce3a15ba35d49ec1cdb5a21.tar.gz translated-content-05e934e46e9be8a20ce3a15ba35d49ec1cdb5a21.tar.bz2 translated-content-05e934e46e9be8a20ce3a15ba35d49ec1cdb5a21.zip |
Global_Objects/Object/defineProperty を更新
- Markdown に変換
- 2021/09/15 時点の英語版に同期
Diffstat (limited to 'files/ja/web/javascript/reference/global_objects')
-rw-r--r-- | files/ja/web/javascript/reference/global_objects/object/defineproperty/index.md | 278 |
1 files changed, 116 insertions, 162 deletions
diff --git a/files/ja/web/javascript/reference/global_objects/object/defineproperty/index.md b/files/ja/web/javascript/reference/global_objects/object/defineproperty/index.md index f647d82bc6..b44e778fa7 100644 --- a/files/ja/web/javascript/reference/global_objects/object/defineproperty/index.md +++ b/files/ja/web/javascript/reference/global_objects/object/defineproperty/index.md @@ -5,85 +5,75 @@ tags: - ECMAScript 5 - JavaScript - JavaScript 1.8.5 - - Method + - メソッド - Object +browser-compat: javascript.builtins.Object.defineProperty translation_of: Web/JavaScript/Reference/Global_Objects/Object/defineProperty --- -<div>{{JSRef}}</div> +{{JSRef}} -<p>静的メソッドの <code><strong>Object.defineProperty()</strong></code> は、あるオブジェクトに新しいプロパティを直接定義したり、オブジェクトの既存のプロパティを変更したりして、そのオブジェクトを返します。</p> +静的メソッドの **`Object.defineProperty()`** は、あるオブジェクトに新しいプロパティを直接定義したり、オブジェクトの既存のプロパティを変更したりして、そのオブジェクトを返します。 -<div class="note"> -<p><strong>メモ:</strong> このメソッドは {{jsxref("Object")}} コンストラクターで直接呼び出すものであって、<code>Object</code> 型のインスタンスで呼ぶものではありません。</p> -</div> +{{EmbedInteractiveExample("pages/js/object-defineproperty.html")}} -<div>{{EmbedInteractiveExample("pages/js/object-defineproperty.html")}}</div> +## 構文 -<div class="hidden">このデモのソースファイルは GitHub リポジトリに格納されています。デモプロジェクトに協力したい場合は、<a href="https://github.com/mdn/interactive-examples">https://github.com/mdn/interactive-examples</a> をクローンしてプルリクエストを送信してください。</div> +```js +Object.defineProperty(obj, prop, descriptor) +``` -<h2 id="Syntax" name="Syntax">構文</h2> +### 引数 -<pre class="syntaxbox">Object.defineProperty(<var>obj</var>, <var>prop</var>, <var>descriptor</var>)</pre> +- `obj` + - : プロパティを定義するオブジェクトです。 +- `prop` + - : 定義または変更するプロパティの名前または {{jsxref("Symbol")}} です。 +- `descriptor` + - : 定義または変更するプロパティの記述子です。 -<h3 id="Parameters" name="Parameters">引数</h3> +### 返値 -<dl> - <dt><code><var>obj</var></code></dt> - <dd>プロパティを定義したいオブジェクト。</dd> - <dt><code><var>prop</var></code></dt> - <dd>定義または変更するプロパティの名前または {{jsxref("Symbol")}}。</dd> - <dt><code><var>descriptor</var></code></dt> - <dd>定義または変更されるプロパティの記述子。</dd> -</dl> +この関数に渡されたオブジェクトをそのまま返します。 -<h3 id="Return_value" name="Return_value">返値</h3> +## 解説 -<p>渡されたオブジェクトをそのまま返します。</p> +このメソッドで、あるオブジェクトのプロパティを明示的に追加または変更することができます。代入による通常のプロパティ追加では、プロパティ列挙 ({{jsxref("Statements/for...in", "for...in")}} ループや {{jsxref("Object.keys")}} メソッド) に現れ、値は変更可能で、また{{jsxref("Operators/delete", "削除", "", 1)}}も可能なプロパティが生成されます。このメソッドでは、これらの詳細事項を既定値から変えることが可能です。既定では、'Object.defineProperty()` を使って追加された値は不変になります。 -<h2 id="Description" name="Description">解説</h2> +プロパティの記述子は、データ記述子とアクセサー記述子の二つに分かれます。**データ記述子**は値を持つプロパティで、その値は書き換え可能にも不可能にもできます。**アクセサー記述子**は、関数のゲッターとセッターの組で表されるプロパティです。記述子はこれら二種類のどちらかでなければならず、両方になることはできません。 -<p>このメソッドで、あるオブジェクトのプロパティを明示的に追加または変更することができます。代入による通常のプロパティ追加では、プロパティ列挙 ({{jsxref("Statements/for...in", "for...in")}} ループや {{jsxref("Object.keys")}} メソッド) に現れ、値は変更可能で、また{{jsxref("Operators/delete", "削除", "", 1)}}も可能なプロパティが生成されます。このメソッドでは、これらの詳細事項を既定値から変えることが可能です。既定では、<code>Object.defineProperty()</code> を使って追加された値は不変になります。</p> +どちらの形でも記述子はオブジェクトで表現します。共通して以下のオプションのキーを持つことができます (注: ここでいう**既定値**とは、`Object.defineProperty()` を使ってプロパティを定義する場合です)。 -<p>プロパティの記述子は、データ記述子とアクセサー記述子の二つに分かれます。<em><dfn>データ記述子</dfn></em>は値を持つプロパティで、その値は書き換え可能にも不可能にもできます。<em><dfn>アクセサー記述子</dfn></em>は、関数のゲッターとセッターの組で表されるプロパティです。記述子はこれら二種類のどちらかでなければならず、両方になることはできません。</p> +- `configurable` + - : `true` である場合のみ、この種の記述子を変更することや、対応するオブジェクトからプロパティを削除することができます。 + **既定値は `false` です。** +- `enumerable` + - : `true` である場合のみ、このプロパティは対応するオブジェクトでのプロパティ列挙に現れます。 + **既定値は `false` です。** -<p>どちらの形でも記述子はオブジェクトで表現します。共通して以下のキーを持つことができます (既定値は Object.defineProperty() を使ってプロパティを定義する場合)。</p> +**データ記述子**は以下のオプションキーも持ちます。 -<dl> - <dt><code>configurable</code></dt> - <dd><code>true</code> である場合のみ、この種の記述子を変更することや、対応するオブジェクトからプロパティを削除することができます。<br> - <strong>既定値は <code>false</code> です。</strong></dd> - <dt><code>enumerable</code></dt> - <dd><code>true</code> である場合のみ、このプロパティは対応するオブジェクトでのプロパティ列挙に現れます。<br> - <strong>既定値は <code>false</code> です。</strong></dd> -</dl> +- `value` + - : プロパティに関連づけられた値です。有効な JavaScript の値 (number, object, function など) である必要があります。<br> + **既定値は {{jsxref("undefined")}} です。** +- `writable` + - : true` である場合のみ、プロパティに関連づけられた値は{{jsxref("Operators#assignment_operators", "代入演算子", "", 1)}}で変更することができます。<br> + **既定値は false` です。** -<p>データ記述子の場合はオプションとして次のキーを持つことができます:</p> +**アクセサー記述子**の場合はオプションとして次のキーも持つことができます。 -<dl> - <dt><code>value</code></dt> - <dd>プロパティに関連づけられた値です。有効な JavaScript の値 (number, object, function など) である必要があります。<br> - <strong>既定値は {{jsxref("undefined")}} です。</strong></dd> - <dt><code>writable</code></dt> - <dd><code>true</code> である場合のみ、プロパティに関連づけられた値は{{jsxref("Operators/Assignment_Operators", "代入演算子", "", 1)}}で変更することができます。<br> - <strong>既定値は <code>false</code> です。</strong></dd> -</dl> +- `get` + - : プロパティのゲッターとなる関数で、ゲッターを設けない場合は {{jsxref("undefined")}} です。プロパティにアクセスするとこの関数が引数なしでコールされます。この関数内で `this` はアクセスしようとしたプロパティを持つオブジェクトになります (プロパティを定義するために作成した記述子オブジェクトではありません)。返値はこのプロパティの値として使われます。 + **既定値は {{jsxref("undefined")}} です。** +- `set` + - : プロパティのセッターとなる関数で、セッターがない場合は {{jsxref("undefined")}} です。プロパティに値が割り当てられたとき、その値を引数としてこの関数がコールされます。この関数内で `this` は割り当てようとしたプロパティを持つオブジェクトになります。 + **既定値は {{jsxref("undefined")}} です。** -<p>アクセサー記述子の場合はオプションとして次のキーを持つことができます。</p> +記述子に `value`, `writable`, `get`, `set` のいずれのキーもない場合、データ記述子として扱われます。記述子に `value` または `writable` と、`get` または `set` のキーの両方がある場合は、例外が発生します。 -<dl> - <dt><code>get</code></dt> - <dd>プロパティのゲッターとなる関数で、ゲッターを設けない場合は {{jsxref("undefined")}} です。プロパティにアクセスするとこの関数が引数なしでコールされます。この関数内で <code>this</code> はアクセスしようとしたプロパティを持つオブジェクトになります(プロパティを定義するために作成した記述子オブジェクトではありません)。戻り値はこのプロパティの値として使われます。<br> - <strong>既定値は {{jsxref("undefined")}} です。</strong></dd> - <dt><code>set</code></dt> - <dd>プロパティのセッターとなる関数で、セッターがない場合は {{jsxref("undefined")}} です。プロパティに値が割り当てられたとき、その値を引数としてこの関数がコールされます。この関数内で <code>this</code> は割り当てようとしたプロパティを持つオブジェクトになります。<br> - <strong>既定値は {{jsxref("undefined")}} です。</strong></dd> -</dl> +これらのキーは必ずしも記述子が直接所有しているとは限らないことに留意してください。継承されたプロパティも同様です。これらの既定値が存在することを保証するには、先行して {{jsxref("Object")}} を凍結しておくか、すべてのオプションを明示的に指定するか、{{jsxref("Object.create", "Object.create(null)")}} で {{jsxref("null")}} に設定するかします。 -<p>記述子に <code>value</code>, <code>writable</code>, <code>get</code>, <code>set</code> のいずれのキーもない場合、データ記述子として扱われます。記述子に <code>value</code> または <code>writable</code> と、<code>get</code> または <code>set</code> のキーの両方がある場合は、例外が投げられます。</p> - -<p>これらのキーは必ずしも記述子が直接所有しているとは限らないことに留意してください。継承されたプロパティも同様です。これらの既定値が存在することを保証するには、先行して {{jsxref("Object.prototype")}} を freeze しておくか、すべてのオプションを明示的に指定するか、{{jsxref("Object.create", "Object.create(null)")}} で {{jsxref("null")}} に設定するかします。</p> - -<pre class="brush: js">// __proto__ を使うやり方 +```js +// __proto__ を使うやり方 var obj = {}; var descriptor = Object.create(null); // 意図しないキーの継承を防止します。 descriptor.value = 'static'; @@ -122,17 +112,16 @@ Object.defineProperty(obj, 'key', withValue('static')); // (value, get, set, enumerable, writable, configurable) を // 追加・削除することを防ぐことができます。 (Object.freeze || Object)(Object.prototype); -</pre> +``` -<h2 id="Examples" name="Examples">例</h2> +## 例 -<p><em>バイナリーフラグ</em>を使って <code>Object.defineProperty</code> を利用したい場合は <a href="/ja/docs/Web/JavaScript/Reference/Global_Objects/Object/defineProperty/Additional_examples">追加の例</a> を見てください。</p> +### プロパティの作成 -<h3 id="Creating_a_property" name="Creating_a_property">プロパティの生成</h3> +オブジェクトに指定されたプロパティが存在しないとき、`Object.defineProperty()` は指定された形で新たなプロパティを生成します。記述子のキーは省略することができ、そのようなキーには既定値が適用されます。 -<p>オブジェクトに指定されたプロパティが存在しないとき、<code>Object.defineProperty()</code> は指定された形で新たなプロパティを生成します。記述子のキーは省略することができ、そのようなキーには既定値が適用されます。</p> - -<pre class="brush: js">var o = {}; // 新しいオブジェクトの生成 +```js +var o = {}; // 新しいオブジェクトの生成 // データ記述子により、defineProperty を用いて // オブジェクトプロパティを追加する例 @@ -169,19 +158,20 @@ Object.defineProperty(o, 'conflict', { }); // TypeError が発生します。value はデータ記述子にのみ、 // get はアクセサー記述子にのみ存在していなければなりません。 -</pre> +``` -<h3 id="Modifying_a_property" name="Modifying_a_property">プロパティの変更</h3> +### プロパティの変更 -<p>プロパティが既に存在している場合、<code>Object.defineProperty()</code> は記述子の値および現在のオブジェクトの設定に基づいて、プロパティの変更を試みます。元の記述子で <code>configurable</code> 属性が <code>false</code> なら、そのプロパティは「変更不可」です。変更不可のプロパティは記述子の属性を変更することができません。データプロパティで <code>writable</code> なら、値を変更することができますし、<code>writable</code> 属性を <code>true</code> から <code>false</code> に変更することが出来ます。変更不可のプロパティはデータとアクセサーの種別を切り替えることはできません。</p> +プロパティが既に存在している場合、`Object.defineProperty()` は記述子の値および現在のオブジェクトの設定に基づいて、プロパティの変更を試みます。元の記述子で `configurable` 属性が `false` なら、そのプロパティは「変更不可」です。変更不可のプロパティは記述子の属性を変更することができません。データプロパティで `writable` なら、値を変更することができますし、`writable` 属性を `true` から `false` に変更することができます。変更不可のプロパティはデータとアクセサーの種別を切り替えることはできません。 -<p>変更不可なプロパティに変更を加えようとすると、新旧の値が同じでない限り {{jsxref("TypeError")}} が投げられます(可能な場合の <code>value</code> と <code>writable</code> の変更は除きます)。</p> +変更不可なプロパティに変更を加えようとすると、新旧の値が同じでない限り {{jsxref("TypeError")}} が発生します (可能な場合の `value` と `writable` の変更は除きます)。 -<h4 id="Writable_attribute" name="Writable_attribute">Writable 属性</h4> +#### writable 属性 -<p><code>writable</code> プロパティ属性が <code>false</code> に設定されているとき、そのプロパティは書換不可になります。代入が出来なくなります。</p> +`writable` プロパティ属性が `false` に設定されているとき、そのプロパティは「書き込み不可」になります。代入ができなくなります。 -<pre class="brush: js">var o = {}; // 新しいオブジェクトの生成 +```js +var o = {}; // 新しいオブジェクトの生成 Object.defineProperty(o, 'a', { value: 37, @@ -204,15 +194,16 @@ console.log(o.a); // 37 がログ出力されます。代入文は動作しま o.b = 3; // TypeError がスローされます: "b" is read-only return o.b; // 上の行は動作せず 2 が返ります(訳注:正しくは「ここに制御は来ません」) }()); -</pre> +``` -<p>例で見たように、書き込み不可のプロパティに書き込もうとしても変更されず、またエラーは発生しません。</p> +例で見たように、書き込み不可のプロパティに書き込もうとしても変更されず、またエラーは発生しません。 -<h4 id="Enumerable_attribute" name="Enumerable_attribute">Enumerable 属性</h4> +#### enumerable 属性 -<p><code>enumerable</code> プロパティ属性は、プロパティが {{jsxref("Statements/for...in", "for...in")}} ループや {{jsxref("Object.keys()")}} に現れるか否かを定義します。</p> +`enumerable` プロパティ属性は、そのプロパティが {{jsxref("Object.assign()")}} や [スプレッド](/ja/docs/Web/JavaScript/Reference/Operators/Spread_syntax)演算子で採り上げられるかどうかを定義します。{{jsxref("Global_Objects/Symbol", "Symbol")}} 以外のプロパティでは、 {{jsxref("Statements/for...in", "for...in")}} ループや {{jsxref("Object.keys()")}} に現れるかどうかも定義します。 -<pre class="brush: js">var o = {}; +```js +var o = {}; Object.defineProperty(o, 'a', { value: 1, enumerable: true @@ -256,13 +247,14 @@ p.c // undefined p.d // 4 p[Symbol.for('e')] // 5 p[Symbol.for('f')] // undefined -</pre> +``` -<h4 id="Configurable_attribute" name="Configurable_attribute">Configurable 属性</h4> +#### configurable 属性 -<p><code>configurable</code> 属性は、プロパティをオブジェクトから削除できるかとプロパティの属性 (<code>value</code> と <code>writable</code> 以外) を変更できるかを同時に制御します。</p> +`configurable` 属性は、プロパティをオブジェクトから削除できるかとプロパティの属性 (`value` と `writable` 以外) を変更できるかを同時に制御します。 -<pre class="brush: js">var o = {}; +```js +var o = {}; Object.defineProperty(o, 'a', { get() { return 1; }, configurable: false @@ -287,18 +279,19 @@ Object.defineProperty(o, 'a', { console.log(o.a); // logs 1 delete o.a; // 何も起きません console.log(o.a); // logs 1 -</pre> +``` -<p><code>o.a</code> の <code>configurable</code> 属性が <code>true</code> である場合、エラーが発生することなく最終的にプロパティが削除されます。</p> +`o.a` の `configurable` 属性が `true` である場合、エラーが発生することなく最終的にプロパティが削除されます。 -<h3 id="Adding_properties_and_default_values" name="Adding_properties_and_default_values">プロパティおよび既定値の追加</h3> +### プロパティおよび既定値の追加 -<p>属性の既定値がどう適用されるかを考えることは重要です。値の割り当てにドット表記を用いた場合と <code>Object.defineProperty()</code> を用いた場合とでは、以下の例で示したとおりに違いがあります。</p> +属性の既定値がどう適用されるかを考えることは重要です。値の割り当てにドット表記を用いた場合と `Object.defineProperty()` を用いた場合とでは、以下の例で示したとおりに違いがあります。 -<pre class="brush: js">var o = {}; +```js +var o = {}; o.a = 1; -// これは以下と同じです: +// これは以下と同じです。 Object.defineProperty(o, 'a', { value: 1, writable: true, @@ -308,20 +301,21 @@ Object.defineProperty(o, 'a', { // その一方で、 Object.defineProperty(o, 'a', { value: 1 }); -// これは以下と同じです: +// これは以下と同じです。 Object.defineProperty(o, 'a', { value: 1, writable: false, configurable: false, enumerable: false }); -</pre> +``` -<h3 id="Custom_Setters_and_Getters" name="Custom_Setters_and_Getters">独自のゲッターおよびセッター</h3> +### 独自のゲッターおよびセッター -<p>例として自律的に記録を行うオブジェクトを作成してみます。<code>temperature</code> プロパティに値が代入されると、配列 <code>archive</code> に要素が一つ追加されます。</p> +例として自律的に記録を行うオブジェクトを作成してみます。`temperature` プロパティに値が代入されると、配列 `archive` に要素が一つ追加されます。 -<pre class="brush: js">function Archiver() { +```js +function Archiver() { var temperature = null; var archive = []; @@ -344,11 +338,12 @@ arc.temperature; // 'get!' arc.temperature = 11; arc.temperature = 13; arc.getArchive(); // [{ val: 11 }, { val: 13 }] -</pre> +``` -<p>次の例では、ゲッターが常に同じ値を返すようにしています。</p> +次の例では、ゲッターが常に同じ値を返すようにしています。 -<pre class="brush: js">var pattern = { +```js +var pattern = { get() { return 'I always return this string, ' + 'whatever you have assigned'; @@ -368,13 +363,14 @@ console.log(instance.myproperty); // I always return this string, whatever you have assigned console.log(instance.myname); // this is my name string -</pre> +``` -<h3 id="Inheritance_of_properties" name="Inheritance_of_properties">プロパティの継承</h3> +### プロパティの継承 -<p>アクセサープロパティを継承されると、その派生クラスでもプロパティがアクセスされたり書き換えられるときに <code>get</code> と <code>set</code> が呼ばれます。これらのメソッドが値を保持するために変数を使っていると、すべてのオブジェクトがその値を共有することになります。</p> +アクセサープロパティを継承されると、その派生クラスでもプロパティがアクセスされたり書き換えられるときに `get` と `set` が呼ばれます。これらのメソッドが値を保持するために変数を使っていると、すべてのオブジェクトがその値を共有することになります。 -<pre class="brush: js">function myclass() { +```js +function myclass() { } var value; @@ -391,11 +387,12 @@ var a = new myclass(); var b = new myclass(); a.x = 1; console.log(b.x); // 1 -</pre> +``` -<p>この問題を回避する方法は値を別のプロパティで保持することです。<code>get</code> と <code>set</code> メソッド内で <code>this</code> はアクセス/書き換えされようとしているプロパティを納めるオブジェクトを指しています。</p> +この問題を回避する方法は値を別のプロパティで保持することです。`get` と `set` メソッド内で `this` はアクセス/変更されようとしているプロパティを納めるオブジェクトを指しています。 -<pre class="brush: js">function myclass() { +```js +function myclass() { } Object.defineProperty(myclass.prototype, "x", { @@ -411,11 +408,12 @@ var a = new myclass(); var b = new myclass(); a.x = 1; console.log(b.x); // undefined -</pre> +``` -<p>アクセサープロパティとは違い、データプロパティは常にオブジェクト自身に格納されるのであって、prototype に格納されるわけではありません。しかし、書き込み不可能なデータプロパティを継承している場合、継承先オブジェクトでも書き換えは阻止されます。</p> +アクセサープロパティとは違い、データプロパティは常にオブジェクト自身に格納されるのであって、prototype に格納されるわけではありません。しかし、書き込み不可能なデータプロパティを継承している場合、継承先オブジェクトでも書き換えは阻止されます。 -<pre class="brush: js">function myclass() { +```js +function myclass() { } myclass.prototype.x = 1; @@ -428,70 +426,26 @@ var a = new myclass(); a.x = 2; console.log(a.x); // 2 console.log(myclass.prototype.x); // 1 -a.y = 2; // 無視されます。strict モードではエラースローされます。 +a.y = 2; // 無視されます。strict モードではエラーが発生します console.log(a.y); // 1 console.log(myclass.prototype.y); // 1 -</pre> - -<h2 id="Specifications" name="Specifications">仕様書</h2> - -<table class="standard-table"> - <thead> - <tr> - <th scope="col">仕様書</th> - </tr> - </thead> - <tbody> - <tr> - <td>{{SpecName('ESDraft', '#sec-object.defineproperty', 'Object.defineProperty')}}</td> - </tr> - </tbody> -</table> - -<h2 id="Browser_compatibility" name="Browser_compatibility">ブラウザーの互換性</h2> - -<p>{{Compat("javascript.builtins.Object.defineProperty")}}</p> - -<h2 id="Compatibility_notes" name="Compatibility_notes">互換性のメモ</h2> - -<h3 id="Redefining_the_length_property_of_an_Array_object" name="Redefining_the_length_property_of_an_Array_object"><code>Array</code> オブジェクトの <code>length</code> プロパティの再定義</h3> - -<p>配列の {{jsxref("Array.length", "length")}} プロパティを再定義することは、通常の再定義の制限に照らせば可能です。({{jsxref("Array.length", "length")}} プロパティは初期状態で構成不可、列挙不可、書き込み可能です。つまり、変更されていない配列では、{{jsxref("Array.length", "length")}} プロパティの値を変更したり書き込み不可にしたりすることが可能です。列挙可否や構成可否、また書き込み不可に変更した後は値や書き込み可否も、変更することはできません。) しかし、すべてのブラウザーがこの再定義を許可しているとは限りません。</p> - -<p>Firefox 4 から 22 までの間では、配列の {{jsxref("Array.length", "length")}} プロパティを再定義しようとすると、無条件に (許可の有無にかかわらず) {{jsxref("TypeError")}} が発生します。</p> - -<p><code>Object.defineProperty()</code> を実装している Chrome のバージョンでは、状況によっては配列の現在の {{jsxref("Array.length", "length")}} プロパティとは異なる length の値を無視することがあります。状況によっては書き込み可否が暗黙に動作しない (そして例外を発生させない) こともあります。また、関連して、{{jsxref("Array.prototype.push")}} のような配列を変更する一部のメソッドが、書き込み不可であることを尊重しないことがあります。</p> - -<p><code>Object.defineProperty()</code> を実装する Safari のバージョンでは配列の現在の {{jsxref("Array.length", "length")}} プロパティと異なる値の length を無視し、また書き込み許可を変更する試みはエラーなしに実行されますが、実際はプロパティの書き込み許可が変更されません。</p> - -<p>Internet Explorer 9 以降と Firefox 23 以降のみが、完全かつ正確に配列の {{jsxref("Array.length", "length")}} プロパティの再定義を実装しているようです。現時点では、配列の {{jsxref("Array.length", "length")}} プロパティの再定義はどのブラウザーでも動作する、あるいは特定のルールに則って動作するとは考えないようにしてください。そして、もしこれが実行<em>できた</em>としても、<a href="http://whereswalden.com/2013/08/05/new-in-firefox-23-the-length-property-of-an-array-can-be-made-non-writable-but-you-shouldnt-do-it/">これを行う本当に良い理由はありません</a>。</p> - -<h3 id="Internet_Explorer_8_specific_notes" name="Internet_Explorer_8_specific_notes">Internet Explorer 8 の特記事項</h3> +``` -<p>Internet Explorer 8 は <code>Object.defineProperty()</code> メソッドを <a class="external" href="https://msdn.microsoft.com/en-us/library/dd229916%28VS.85%29.aspx">DOM オブジェクトでのみ使用できる</a>ものとして実装しました。以下 2 点に注意が必要です:</p> +## 仕様書 -<ul> - <li>ネイティブオブジェクトに対して <code>Object.defineProperty()</code> を用いようとするとエラーが発生します。</li> - <li>プロパティの属性には特定の値を設定しなければなりません。<code>configurable</code>, <code>enumerable</code>, <code>writable</code> の各属性に対して、データ記述子ではすべて <code>true</code> に、アクセサー記述子では <code>configurable</code> に <code>true</code>、<code>enumerable</code> に <code>false</code> にです。(?)ほかの値(?)を与えようとすると、エラーが発生します。</li> - <li>プロパティの再設定には、始めにプロパティの削除が必要です。プロパティが削除されていない場合、再設定を試みる前の状態のままになります。</li> -</ul> +{{Specifications}} -<h3 id="Chrome_37_and_below_specific_notes" name="Chrome_37_and_below_specific_notes">Chrome 37 以下の特記事項</h3> +## ブラウザーの互換性 -<p>Chrome 37 以下には、<code>writable: false</code> 指定を行なった "prototype" プロパティを関数に定義する場合に、想定通りに動かない <a href="https://bugs.chromium.org/p/v8/issues/detail?id=3448">バグ</a> があります。</p> +{{Compat}} -<h2 id="See_also" name="See_also">関連情報</h2> +## 関連情報 -<ul> - <li><a href="/ja/docs/Enumerability_and_ownership_of_properties">列挙可能性とプロパティの所有権</a></li> - <li>{{jsxref("Object.defineProperties()")}}</li> - <li>{{jsxref("Object.propertyIsEnumerable()")}}</li> - <li>{{jsxref("Object.getOwnPropertyDescriptor()")}}</li> - <li>{{jsxref("Object.prototype.watch()")}}</li> - <li>{{jsxref("Object.prototype.unwatch()")}}</li> - <li>{{jsxref("Operators/get", "get")}}</li> - <li>{{jsxref("Operators/set", "set")}}</li> - <li>{{jsxref("Object.create()")}}</li> - <li><a href="/ja/docs/Web/JavaScript/Reference/Global_Objects/Object/defineProperty/Additional_examples">追加の <code>Object.defineProperty</code> の例</a></li> - <li>{{jsxref("Reflect.defineProperty()")}}</li> -</ul> +- [プロパティの列挙可能性と所有権](/ja/docs/Web/JavaScript/Enumerability_and_ownership_of_properties) +- {{jsxref("Object.defineProperties()")}} +- {{jsxref("Object.propertyIsEnumerable()")}} +- {{jsxref("Object.getOwnPropertyDescriptor()")}} +- {{jsxref("Functions/get", "get")}} +- {{jsxref("Functions/set", "set")}} +- {{jsxref("Object.create()")}} +- {{jsxref("Reflect.defineProperty()")}} |