From bba1788dd593e5f64bfb6814cb550259638619a0 Mon Sep 17 00:00:00 2001 From: Masahiro FUJIMOTO Date: Mon, 9 Aug 2021 13:01:42 +0900 Subject: Web/JavaScript/Reference/Global_Objects/Object 以下の一部を Markdown に変換 (#1691) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 以下のページを Markdown に変換。必要に応じて 2021/07/25 時点の英語版に同期。 - Web/JavaScript/Reference/Global_Objects/Object - Web/JavaScript/Reference/Global_Objects/Object/__defineGetter__ - Web/JavaScript/Reference/Global_Objects/Object/__defineSetter__ - Web/JavaScript/Reference/Global_Objects/Object/__lookupGetter__ - Web/JavaScript/Reference/Global_Objects/Object/__lookupSetter__ - Web/JavaScript/Reference/Global_Objects/Object/assign - Web/JavaScript/Reference/Global_Objects/Object/constructor - Web/JavaScript/Reference/Global_Objects/Object/Object - Web/JavaScript/Reference/Global_Objects/Object/proto --- .../object/__definegetter__/index.html | 98 ------- .../object/__definegetter__/index.md | 87 +++++++ .../object/__definesetter__/index.html | 113 -------- .../object/__definesetter__/index.md | 104 ++++++++ .../object/__lookupgetter__/index.html | 88 ------- .../object/__lookupgetter__/index.md | 76 ++++++ .../object/__lookupsetter__/index.html | 88 ------- .../object/__lookupsetter__/index.md | 76 ++++++ .../global_objects/object/assign/index.html | 276 -------------------- .../global_objects/object/assign/index.md | 273 ++++++++++++++++++++ .../global_objects/object/constructor/index.html | 255 ------------------ .../global_objects/object/constructor/index.md | 224 ++++++++++++++++ .../reference/global_objects/object/index.html | 285 --------------------- .../reference/global_objects/object/index.md | 253 ++++++++++++++++++ .../global_objects/object/object/index.html | 82 ------ .../global_objects/object/object/index.md | 72 ++++++ .../global_objects/object/proto/index.html | 129 ---------- .../reference/global_objects/object/proto/index.md | 116 +++++++++ 18 files changed, 1281 insertions(+), 1414 deletions(-) delete mode 100644 files/ja/web/javascript/reference/global_objects/object/__definegetter__/index.html create mode 100644 files/ja/web/javascript/reference/global_objects/object/__definegetter__/index.md delete mode 100644 files/ja/web/javascript/reference/global_objects/object/__definesetter__/index.html create mode 100644 files/ja/web/javascript/reference/global_objects/object/__definesetter__/index.md delete mode 100644 files/ja/web/javascript/reference/global_objects/object/__lookupgetter__/index.html create mode 100644 files/ja/web/javascript/reference/global_objects/object/__lookupgetter__/index.md delete mode 100644 files/ja/web/javascript/reference/global_objects/object/__lookupsetter__/index.html create mode 100644 files/ja/web/javascript/reference/global_objects/object/__lookupsetter__/index.md delete mode 100644 files/ja/web/javascript/reference/global_objects/object/assign/index.html create mode 100644 files/ja/web/javascript/reference/global_objects/object/assign/index.md delete mode 100644 files/ja/web/javascript/reference/global_objects/object/constructor/index.html create mode 100644 files/ja/web/javascript/reference/global_objects/object/constructor/index.md delete mode 100644 files/ja/web/javascript/reference/global_objects/object/index.html create mode 100644 files/ja/web/javascript/reference/global_objects/object/index.md delete mode 100644 files/ja/web/javascript/reference/global_objects/object/object/index.html create mode 100644 files/ja/web/javascript/reference/global_objects/object/object/index.md delete mode 100644 files/ja/web/javascript/reference/global_objects/object/proto/index.html create mode 100644 files/ja/web/javascript/reference/global_objects/object/proto/index.md (limited to 'files/ja/web') diff --git a/files/ja/web/javascript/reference/global_objects/object/__definegetter__/index.html b/files/ja/web/javascript/reference/global_objects/object/__definegetter__/index.html deleted file mode 100644 index bd5b439d1b..0000000000 --- a/files/ja/web/javascript/reference/global_objects/object/__definegetter__/index.html +++ /dev/null @@ -1,98 +0,0 @@ ---- -title: Object.prototype.__defineGetter__() -slug: Web/JavaScript/Reference/Global_Objects/Object/__defineGetter__ -tags: - - JavaScript - - JavaScript Reference - - Method - - Object - - Prototype -translation_of: Web/JavaScript/Reference/Global_Objects/Object/__defineGetter__ ---- -
{{JSRef}}
- -
-

この機能は非推奨となり、オブジェクト初期化子の構文または {{jsxref("Object.defineProperty()")}} API を使用してゲッターを定義する方法で置き換えられました。この機能は広く実装されていますが、古い使い方であるために ECMAScript 仕様書で非推奨となっています。よりよい代替策が存在するので、このメソッドを使用しないでください。

-
- -

__defineGetter__ メソッドは、オブジェクトのプロパティと関数を結び付け、そのプロパティが参照されるときに呼び出されるようにします。

- -

構文

- -
obj.__defineGetter__(prop, func)
- -

引数

- -
-
prop
-
関数と結びつけるプロパティの名前を表す文字列です。
-
func
-
プロパティの値を参照するときに呼び出される関数です。
-
- -

返値

- -

{{jsxref("undefined")}}.

- -

説明

- -

__defineGetter__ を使用することで、既存のオブジェクトに{{jsxref("Operators/get", "ゲッター", "", 1)}}を定義する事ができます。

- -

- -

標準外かつ非推奨の方法

- -
var o = {};
-o.__defineGetter__('gimmeFive', function() { return 5; });
-console.log(o.gimmeFive); // 5
-
- -

標準準拠の方法

- -
// Using the get operator
-var o = { get gimmeFive() { return 5; } };
-console.log(o.gimmeFive); // 5
-
-// Using Object.defineProperty
-var o = {};
-Object.defineProperty(o, 'gimmeFive', {
-  get: function() {
-    return 5;
-  }
-});
-console.log(o.gimmeFive); // 5
-
- -

仕様書

- - - - - - - - - - - - -
仕様書
{{SpecName('ESDraft', '#sec-object.prototype.__defineGetter__', 'Object.prototype.__defineGetter__()')}}
- -

ブラウザーの互換性

- -
-

{{Compat("javascript.builtins.Object.defineGetter")}}

-
- -

関連情報

- - diff --git a/files/ja/web/javascript/reference/global_objects/object/__definegetter__/index.md b/files/ja/web/javascript/reference/global_objects/object/__definegetter__/index.md new file mode 100644 index 0000000000..671fc2f25b --- /dev/null +++ b/files/ja/web/javascript/reference/global_objects/object/__definegetter__/index.md @@ -0,0 +1,87 @@ +--- +title: Object.prototype.__defineGetter__() +slug: Web/JavaScript/Reference/Global_Objects/Object/__defineGetter__ +tags: + - Deprecated + - JavaScript + - Method + - Object + - Prototype + - Polyfill +browser-compat: javascript.builtins.Object.defineGetter +translation_of: Web/JavaScript/Reference/Global_Objects/Object/__defineGetter__ +--- +{{JSRef}} + +> **Warning:** この機能は非推奨となり、[オブジェクト初期化子の構文](/ja/docs/Web/JavaScript/Reference/Operators/Object_initializer)または {{jsxref("Object.defineProperty()")}} API を使用してゲッターを定義する方法で置き換えられました。この機能は広く実装されていますが、古い使い方であるために [ECMAScript 仕様書](https://tc39.github.io/ecma262/#sec-additional-ecmascript-features-for-web-browsers)で非推奨となっています。よりよい代替策が存在するので、このメソッドを使用しないでください。 + +**`__defineGetter__`** メソッドは、オブジェクトのプロパティと関数を結び付け、そのプロパティが参照されるときに呼び出されるようにします。 + +## 構文 + +```js +__defineGetter__(prop, func) +``` + +### 引数 + +- `prop` + - : 関数と結びつけるプロパティの名前を表す文字列です。 +- `func` + - : プロパティの値を参照するときに呼び出される関数です。 + +### 返値 + +{{jsxref("undefined")}} です。 + +## 解説 + +`__defineGetter__` を使用することで、既存のオブジェクトに{{jsxref("Functions/get", "ゲッター", "", 1)}}を定義することができます。 + +## 例 + +### 標準外かつ非推奨の方法 + +```js +var o = {}; +o.__defineGetter__('gimmeFive', function() { return 5; }); +console.log(o.gimmeFive); // 5 +``` + +### 標準準拠の方法 + +```js +// get 演算子を使用 +var o = { get gimmeFive() { return 5; } }; +console.log(o.gimmeFive); // 5 + +// Object.defineProperty を使用 +var o = {}; +Object.defineProperty(o, 'gimmeFive', { + get: function() { + return 5; + } +}); +console.log(o.gimmeFive); // 5 +``` + +## 仕様書 + +{{Specifications}} + +## ブラウザーの互換性 + +{{Compat}} + +## 関連情報 + +- `Object.prototype.__defineGetter__` のポリフィルは [`core-js`](https://github.com/zloirock/core-js#ecmascript-object) で利用できます +- {{jsxref("Object.prototype.__defineSetter__()")}} +- {{jsxref("Functions/get", "get")}} 演算子 +- {{jsxref("Object.defineProperty()")}} +- {{jsxref("Object.prototype.__lookupGetter__()")}} +- {{jsxref("Object.prototype.__lookupSetter__()")}} +- [JavaScript ガイド: ゲッターとセッターの定義](/ja/docs/Web/JavaScript/Guide/Working_with_Objects#defining_getters_and_setters) +- [\[Blog + Post\] Deprecation of \_\_defineGetter\_\_ and \_\_defineSetter\_\_](https://whereswalden.com/2010/04/16/more-spidermonkey-changes-ancient-esoteric-very-rarely-used-syntax-for-creating-getters-and-setters-is-being-removed/) +- {{bug(647423)}} diff --git a/files/ja/web/javascript/reference/global_objects/object/__definesetter__/index.html b/files/ja/web/javascript/reference/global_objects/object/__definesetter__/index.html deleted file mode 100644 index 43eb35b52f..0000000000 --- a/files/ja/web/javascript/reference/global_objects/object/__definesetter__/index.html +++ /dev/null @@ -1,113 +0,0 @@ ---- -title: Object.prototype.__defineSetter__() -slug: Web/JavaScript/Reference/Global_Objects/Object/__defineSetter__ -tags: - - Deprecated - - JavaScript - - Method - - Object - - Prototype -translation_of: Web/JavaScript/Reference/Global_Objects/Object/__defineSetter__ ---- -
{{JSRef}}
- -
-

この機能は非推奨となり、オブジェクト初期化子の構文または {{jsxref("Object.defineProperty()")}} API を使用してセッターを定義する方法で置き換えられました。

- -

ただし、ウェブ上では広く実装および利用されているため、ブラウザーが実装をやめる可能性は極めて低いと考えられます。

-
- -

__defineSetter__ メソッドは、オブジェクトのプロパティと関数を結び付け、そのプロパティを設定しようとすると呼び出されるようにします。

- -

構文

- -
obj.__defineSetter__(prop, fun)
- -

引数

- -
-
prop
-
関数と結びつけられたプロパティの名前を表す文字列です。
-
fun
-
プロパティへ値を設定しようとしたときに呼び出される関数です。この関数は以下の形式をとります。 -
function(val) { . . . }
- -
-
val
-
An alias for the variable that holds the value attempted to be assigned to prop へ代入しようとする値を保持する変数のエイリアスです。
-
-
-
- -

返値

- -

{{jsxref("undefined")}}.

- -

説明

- -

__defineSetter__ を使用することで、既存のオブジェクトにセッター関数を定義する事ができます。

- -

- -

標準外かつ非推奨の方法

- -
var o = {};
-o.__defineSetter__('value', function(val) { this.anotherValue = val; });
-o.value = 5;
-console.log(o.value); // undefined
-console.log(o.anotherValue); // 5
-
- -

標準準拠の方法

- -
// Using the set operator
-var o = { set value(val) { this.anotherValue = val; } };
-o.value = 5;
-console.log(o.value); // undefined
-console.log(o.anotherValue); // 5
-
-// Using Object.defineProperty
-var o = {};
-Object.defineProperty(o, 'value', {
-  set: function(val) {
-    this.anotherValue = val;
-  }
-});
-o.value = 5;
-console.log(o.value); // undefined
-console.log(o.anotherValue); // 5
-
- -

仕様書

- - - - - - - - - - - - -
仕様書
{{SpecName('ESDraft', '#sec-object.prototype.__defineSetter__', 'Object.prototype.__defineSetter__()')}}
- -

ブラウザーの互換性

- -
-

{{Compat("javascript.builtins.Object.defineSetter")}}

-
- -

関連情報

- - diff --git a/files/ja/web/javascript/reference/global_objects/object/__definesetter__/index.md b/files/ja/web/javascript/reference/global_objects/object/__definesetter__/index.md new file mode 100644 index 0000000000..f296427535 --- /dev/null +++ b/files/ja/web/javascript/reference/global_objects/object/__definesetter__/index.md @@ -0,0 +1,104 @@ +--- +title: Object.prototype.__defineSetter__() +slug: Web/JavaScript/Reference/Global_Objects/Object/__defineSetter__ +tags: + - Deprecated + - JavaScript + - Method + - Object + - Prototype + - Polyfill +browser-compat: javascript.builtins.Object.defineSetter +translation_of: Web/JavaScript/Reference/Global_Objects/Object/__defineSetter__ +--- +{{JSRef}} + +> **Warning:** この機能は非推奨となり、[オブジェクト初期化子の構文](/ja/docs/Web/JavaScript/Reference/Operators/Object_initializer)または {{jsxref("Object.defineProperty()")}} API を使用してセッターを定義する方法で置き換えられました。 +> +> ただし、ウェブ上では広く実装され利用されているため、ブラウザーが実装をやめる可能性は極めて低いと考えられます。 + +**`__defineSetter__`** メソッドは、オブジェクトのプロパティと関数を結び付け、そのプロパティを設定しようとすると呼び出されるようにします。 + +## 構文 + +```js +__defineSetter__(prop, fun) +``` + +### 引数 + +- `prop` + - : 関数と結びつけられたプロパティの名前を表す文字列です。 +- `fun` + + - : プロパティへ値を設定しようとしたときに呼び出される関数です。この関数は以下の形式をとります。 + + ```js + function(val) { . . . } + ``` + + - `val` + - : `prop` へ代入しようとする値を保持する変数の別名です。 + +### 返値 + +{{jsxref("undefined")}} です。 + +## 解説 + +`__defineSetter__` メソッドにより、既存のオブジェクトに{{jsxref("Functions/set", "セッター", + "", 1)}}を定義することができます。 + +## 例 + +### 標準外かつ非推奨の方法 + +```js +var o = {}; +o.__defineSetter__('value', function(val) { this.anotherValue = val; }); +o.value = 5; +console.log(o.value); // undefined +console.log(o.anotherValue); // 5 +``` + +### 標準準拠の方法 + +```js +// set 演算子の使用 +var o = { set value(val) { this.anotherValue = val; } }; +o.value = 5; +console.log(o.value); // undefined +console.log(o.anotherValue); // 5 + +// Object.defineProperty の使用 +var o = {}; +Object.defineProperty(o, 'value', { + set: function(val) { + this.anotherValue = val; + } +}); +o.value = 5; +console.log(o.value); // undefined +console.log(o.anotherValue); // 5 +``` + +## 仕様書 + +{{Specifications}} + +## ブラウザーの互換性 + +{{Compat}} + +## 関連情報 + +- `Object.prototype.__defineSetter__` のポリフィルは [`core-js`](https://github.com/zloirock/core-js#ecmascript-object) で利用できます。 +- {{jsxref("Object.prototype.__defineGetter__()")}} +- {{jsxref("Functions/set", "set")}} 演算子 +- {{jsxref("Object.defineProperty()")}} +- {{jsxref("Object.prototype.__lookupGetter__()")}} +- {{jsxref("Object.prototype.__lookupSetter__()")}} +- [JavaScript ガイド: ゲッターとセッターの定義](/ja/docs/Web/JavaScript/Guide/Working_with_Objects#defining_getters_and_setters) +- [\[Blog + Post\] Deprecation of \_\_defineGetter\_\_ and \_\_defineSetter\_\_](http://whereswalden.com/2010/04/16/more-spidermonkey-changes-ancient-esoteric-very-rarely-used-syntax-for-creating-getters-and-setters-is-being-removed/) +- {{bug(647423)}} diff --git a/files/ja/web/javascript/reference/global_objects/object/__lookupgetter__/index.html b/files/ja/web/javascript/reference/global_objects/object/__lookupgetter__/index.html deleted file mode 100644 index 0319726940..0000000000 --- a/files/ja/web/javascript/reference/global_objects/object/__lookupgetter__/index.html +++ /dev/null @@ -1,88 +0,0 @@ ---- -title: Object.prototype.__lookupGetter__() -slug: Web/JavaScript/Reference/Global_Objects/Object/__lookupGetter__ -tags: - - Deprecated - - JavaScript - - Method - - Object - - Prototype -translation_of: Web/JavaScript/Reference/Global_Objects/Object/__lookupGetter__ ---- -
{{JSRef}} {{deprecated_header}}
- -

__lookupGetter__ メソッドは、指定されたプロパティに結びつけられているゲッター関数を返します。

- -

構文

- -
obj.__lookupGetter__(sprop)
- -

引数

- -
-
sprop
-
ゲッター関数を返すプロパティの名前を表す文字列です。
-
- -

返値

- -

指定されたプロパティへのゲッターとしてバインドされている関数です。

- -

解説

- -

オブジェクトのプロパティに対してゲッター関数が定義されていても、そのプロパティを通してゲッター関数への参照を得ることはできません。そのプロパティは、ゲッター関数の返値を参照するからです。 __lookupGetter__ を使うことで、ゲッター関数への参照を得ることができます。

- -

これは {{jsxref("Object.getOwnPropertyDescriptor()")}} と {{jsxref("Object.getPrototypeOf()")}} を使用する標準化された方法で行うことが可能になりました。

- -

- -

プロパティゲッターを取得するための標準準拠の方法と標準外の方法

- -
var obj = {
-  get foo() {
-    return Math.random() > 0.5 ? 'foo' : 'bar';
-  }
-};
-
-
-// 標準外で非推奨の方法
-obj.__lookupGetter__('foo');
-// (function() { return Math.random() > 0.5 ? 'foo' : 'bar'; })
-
-
-// 標準準拠の方法
-Object.getOwnPropertyDescriptor(obj, "foo").get;
-// (function() { return Math.random() > 0.5 ? 'foo' : 'bar'; })
-
- -

仕様書

- - - - - - - - - - - - -
仕様書
{{SpecName('ESDraft', '#sec-object.prototype.__lookupGetter__', 'Object.prototype.__lookupGetter__()')}}
- -

ブラウザーの互換性

- -
-

{{Compat("javascript.builtins.Object.lookupGetter")}}

-
- -

関連情報

- - diff --git a/files/ja/web/javascript/reference/global_objects/object/__lookupgetter__/index.md b/files/ja/web/javascript/reference/global_objects/object/__lookupgetter__/index.md new file mode 100644 index 0000000000..8d3bae0866 --- /dev/null +++ b/files/ja/web/javascript/reference/global_objects/object/__lookupgetter__/index.md @@ -0,0 +1,76 @@ +--- +title: Object.prototype.__lookupGetter__() +slug: Web/JavaScript/Reference/Global_Objects/Object/__lookupGetter__ +tags: + - Deprecated + - JavaScript + - Method + - Object + - Prototype + - Polyfill +browser-compat: javascript.builtins.Object.lookupGetter +translation_of: Web/JavaScript/Reference/Global_Objects/Object/__lookupGetter__ +--- +{{JSRef}} {{deprecated_header}} + +**`__lookupGetter__`** メソッドは、指定されたプロパティに結びつけられているゲッター関数を返します。 + +## 構文 + +```js +__lookupGetter__(sprop) +``` + +### 引数 + +- `sprop` + - : ゲッター関数を返すプロパティの名前を表す文字列です。 + +### 返値 + +指定されたプロパティへのゲッターとしてバインドされている関数です。 + +## 解説 + +オブジェクトのプロパティに対してゲッター関数が定義されていても、そのプロパティを通してゲッター関数への参照を得ることはできません。そのプロパティは、ゲッター関数の返値を参照するからです。 `__lookupGetter__` を使うことで、そのゲッター関数への参照を得ることができます。 + +これは標準化された {{jsxref("Object.getOwnPropertyDescriptor()")}} と {{jsxref("Object.getPrototypeOf()")}} を使用する方法で行うことが可能になりました。 + +## 例 + +### プロパティゲッターを取得するための標準準拠の方法と標準外の方法 + +```js +var obj = { + get foo() { + return Math.random() > 0.5 ? 'foo' : 'bar'; + } +}; + +// 標準外かつ非推奨の方法 +obj.__lookupGetter__('foo'); +// (function() { return Math.random() > 0.5 ? 'foo' : 'bar'; }) + +// 標準準拠の方法 +Object.getOwnPropertyDescriptor(obj, "foo").get; +// (function() { return Math.random() > 0.5 ? 'foo' : 'bar'; }) +``` + +## 仕様書 + +{{Specifications}} + +## ブラウザーの互換性 + +{{Compat}} + +## 関連情報 + +- `Object.prototype.__lookupGetter__` のポリフィルは [`core-js`](https://github.com/zloirock/core-js#ecmascript-object) で利用できます +- {{jsxref("Object.prototype.__lookupSetter__()")}} +- {{jsxref("Functions/get", "get")}} 演算子 +- {{jsxref("Object.getOwnPropertyDescriptor()")}} と + {{jsxref("Object.getPrototypeOf()")}} +- {{jsxref("Object.prototype.__defineGetter__()")}} +- {{jsxref("Object.prototype.__defineSetter__()")}} +- [JavaScript ガイド: ゲッターとセッターの定義](/ja/docs/Web/JavaScript/Guide/Working_with_Objects#defining_getters_and_setters) diff --git a/files/ja/web/javascript/reference/global_objects/object/__lookupsetter__/index.html b/files/ja/web/javascript/reference/global_objects/object/__lookupsetter__/index.html deleted file mode 100644 index 79d7ebb143..0000000000 --- a/files/ja/web/javascript/reference/global_objects/object/__lookupsetter__/index.html +++ /dev/null @@ -1,88 +0,0 @@ ---- -title: Object.prototype.__lookupSetter__() -slug: Web/JavaScript/Reference/Global_Objects/Object/__lookupSetter__ -tags: - - Deprecated - - JavaScript - - Method - - Object - - Prototype -translation_of: Web/JavaScript/Reference/Global_Objects/Object/__lookupSetter__ ---- -
{{JSRef}} {{deprecated_header}}
- -

__lookupSetter__ メソッドは、指定されたプロパティに結びつけられているセッター関数を返します。

- -

構文

- -
obj.__lookupSetter__(sprop)
- -

引数

- -
-
sprop
-
セッター関数を返すプロパティの名前を表す文字列です。
-
- -

返値

- -

指定されたプロパティへのセッターとしてバインドされている関数です。

- -

解説

- -

オブジェクトのプロパティに対してセッター関数が定義されていても、そのプロパティを通してセッター関数への参照を得ることはできません。そのプロパティは、セッター関数の返値を参照するからです。 __lookupSetter__ を使うことで、セッター関数への参照を得ることができます。

- -

これは {{jsxref("Object.getOwnPropertyDescriptor()")}} を使用する標準化された方法で行うことが可能になりました。

- -

- -

プロパティセッターを取得するための標準準拠の方法と標準外の方法

- -
var obj = {
-  set foo(value) {
-    this.bar = value;
-  }
-};
-
-
-// 標準外で非推奨の方法
-obj.__lookupSetter__('foo')
-// (function(value) { this.bar = value; })
-
-
-// 標準準拠の方法
-Object.getOwnPropertyDescriptor(obj, 'foo').set;
-// (function(value) { this.bar = value; })
-
- -

仕様書

- - - - - - - - - - - - -
仕様書
{{SpecName('ESDraft', '#sec-object.prototype.__lookupSetter__', 'Object.prototype.__lookupSetter__()')}}
- -

ブラウザーの互換性

- -
-

{{Compat("javascript.builtins.Object.lookupSetter")}}

-
- -

関連情報

- - diff --git a/files/ja/web/javascript/reference/global_objects/object/__lookupsetter__/index.md b/files/ja/web/javascript/reference/global_objects/object/__lookupsetter__/index.md new file mode 100644 index 0000000000..3c657d768c --- /dev/null +++ b/files/ja/web/javascript/reference/global_objects/object/__lookupsetter__/index.md @@ -0,0 +1,76 @@ +--- +title: Object.prototype.__lookupSetter__() +slug: Web/JavaScript/Reference/Global_Objects/Object/__lookupSetter__ +tags: + - Deprecated + - JavaScript + - Method + - Object + - Prototype + - Polyfill +browser-compat: javascript.builtins.Object.lookupSetter +translation_of: Web/JavaScript/Reference/Global_Objects/Object/__lookupSetter__ +--- +{{JSRef}} {{deprecated_header}} + +**`__lookupSetter__`** メソッドは、指定されたプロパティに結びつけられているセッター関数を返します。 + +## 構文 + +```js +__lookupSetter__(sprop) +``` + +### 引数 + +- `sprop` + - : セッター関数を返すプロパティの名前を表す文字列です。 + +### 返値 + +指定されたプロパティへのセッターとしてバインドされている関数です。 + +## 解説 + +オブジェクトのプロパティに対してセッター関数が定義されていても、そのプロパティを通してセッター関数への参照を得ることはできません。そのプロパティは、セッター関数の返値を参照するからです。 `__lookupSetter__` を使うことで、セッター関数への参照を得ることができます。 + +これは標準化された {{jsxref("Object.getOwnPropertyDescriptor()")}} を使用する方法で行うことが可能になりました。 + +## 例 + +### プロパティセッターを取得するための標準準拠の方法と標準外の方法 + +```js +var obj = { + set foo(value) { + this.bar = value; + } +}; + +// 標準外かつ非推奨の方法 +obj.__lookupSetter__('foo') +// (function(value) { this.bar = value; }) + +// 標準準拠の方法 +Object.getOwnPropertyDescriptor(obj, 'foo').set; +// (function(value) { this.bar = value; }) +``` + +## 仕様書 + +{{Specifications}} + +## ブラウザーの互換性 + +{{Compat}} + +## 関連情報 + +- `Object.prototype.__lookupSetter__` のポリフィルは [`core-js`](https://github.com/zloirock/core-js#ecmascript-object) で利用できます +- {{jsxref("Object.prototype.__lookupGetter__()")}} +- {{jsxref("Functions/set", "set")}} 演算子 +- {{jsxref("Object.getOwnPropertyDescriptor()")}} と + {{jsxref("Object.getPrototypeOf()")}} +- {{jsxref("Object.prototype.__defineGetter__()")}} +- {{jsxref("Object.prototype.__defineSetter__()")}} +- [JavaScript ガイド: ゲッターとセッターの定義](/ja/docs/Web/JavaScript/Guide/Working_with_Objects#defining_getters_and_setters) diff --git a/files/ja/web/javascript/reference/global_objects/object/assign/index.html b/files/ja/web/javascript/reference/global_objects/object/assign/index.html deleted file mode 100644 index 9a3db4cc82..0000000000 --- a/files/ja/web/javascript/reference/global_objects/object/assign/index.html +++ /dev/null @@ -1,276 +0,0 @@ ---- -title: Object.assign() -slug: Web/JavaScript/Reference/Global_Objects/Object/assign -tags: - - ECMAScript 2015 - - JavaScript - - Method - - Object - - Reference - - polyfill - - メソッド -translation_of: Web/JavaScript/Reference/Global_Objects/Object/assign ---- -

{{JSRef}}

- -

Object.assign() メソッドは、すべての{{jsxref("Object/propertyIsEnumerable", "列挙可能", "", 1)}}な{{jsxref("Object/hasOwnProperty", "自身のプロパティ", "", 1)}}の値を、1つ以上のコピー元オブジェクトからコピー先オブジェクトにコピーするために使用されます。

- -
{{EmbedInteractiveExample("pages/js/object-assign.html")}}
- - - -

構文

- -
Object.assign(target, ...sources)
- -

引数

- -
-
target
-
コピー先オブジェクト — ソースのプロパティを適用するもので、変更後に返されます。
-
sources
-
コピー元オブジェクト — 適用したいプロパティを含むオブジェクトです。
-
- -

返値

- -

コピー先オブジェクトです。

- -

解説

- -

コピー先オブジェクトのプロパティは、コピー元に同じ{{jsxref("Object/keys", "キー", "", 1)}}のプロパティがあると上書きされます。より後のコピー元のプロパティが、より前のものを同様に上書きします。

- -

Object.assign() メソッドは、コピー元オブジェクトから列挙可能 (enumerable) かつ直接所有 (own) のプロパティだけをコピー先オブジェクトにコピーします。この際、コピー元オブジェクトには [[Get]]、コピー先オブジェクトには [[Set]] を使いますので、ゲッターセッターを呼び出すことになります。これはプロパティの代入 (assign) であり、プロパティをコピーしたり新しく定義をしたりするのとは違います。そのため、コピー元にゲッターが存在する場合、新しいプロパティをプロトタイプにマージする用途には不適切でしょう。

- -

プロパティ定義を (列挙可能 (enumerable) 属性も含めて) プロトタイプの中にコピーするには、このメソッドではなく {{jsxref("Object.getOwnPropertyDescriptor()")}} と {{jsxref("Object.defineProperty()")}} を使用してください。

- -

{{jsxref("String")}} と {{jsxref("Symbol")}} の両方のプロパティがコピーされます。

- -

エラーが発生した場合、例えばプロパティが書き込み不可の場合は、 {{jsxref("TypeError")}} が発生しますが、エラーが発生する前にプロパティが追加される場合、 target オブジェクトが変更されることがあります。

- -
-

Note: Object.assign() はコピー元の値が {{jsxref("null")}} や {{jsxref("undefined")}} でも例外を投げないことに注意して下さい。

-
- -

ポリフィル

- -

この{{Glossary("Polyfill","ポリフィル")}}は、 ES5 にシンボルがないため、シンボルのプロパティに対応していません。

- -
if (typeof Object.assign !== 'function') {
-  // Must be writable: true, enumerable: false, configurable: true
-  Object.defineProperty(Object, "assign", {
-    value: function assign(target, varArgs) { // .length of function is 2
-      'use strict';
-      if (target === null || target === undefined) {
-        throw new TypeError('Cannot convert undefined or null to object');
-      }
-
-      var to = Object(target);
-
-      for (var index = 1; index < arguments.length; index++) {
-        var nextSource = arguments[index];
-
-        if (nextSource !== null && nextSource !== undefined) {
-          for (var nextKey in nextSource) {
-            // Avoid bugs when hasOwnProperty is shadowed
-            if (Object.prototype.hasOwnProperty.call(nextSource, nextKey)) {
-              to[nextKey] = nextSource[nextKey];
-            }
-          }
-        }
-      }
-      return to;
-    },
-    writable: true,
-    configurable: true
-  });
-}
-
- -

- -

オブジェクトの複製

- -
const obj = { a: 1 };
-const copy = Object.assign({}, obj);
-console.log(copy); // { a: 1 }
-
- -

深い複製についての注意

- -

Object.assign() はプロパティの値をコピーするため、深い複製を行うには別な方法を使用する必要があります。

- -

元の値がオブジェクトへの参照である場合、参照の値のみをコピーするからです。

- -
function test() {
-  'use strict';
-
-  let obj1 = { a: 0 , b: { c: 0}};
-  let obj2 = Object.assign({}, obj1);
-  console.log(JSON.stringify(obj2)); // { "a": 0, "b": { "c": 0}}
-
-  obj1.a = 1;
-  console.log(JSON.stringify(obj1)); // { "a": 1, "b": { "c": 0}}
-  console.log(JSON.stringify(obj2)); // { "a": 0, "b": { "c": 0}}
-
-  obj2.a = 2;
-  console.log(JSON.stringify(obj1)); // { "a": 1, "b": { "c": 0}}
-  console.log(JSON.stringify(obj2)); // { "a": 2, "b": { "c": 0}}
-
-  obj2.b.c = 3;
-  console.log(JSON.stringify(obj1)); // { "a": 1, "b": { "c": 3}}
-  console.log(JSON.stringify(obj2)); // { "a": 2, "b": { "c": 3}}
-
-  // Deep Clone
-  obj1 = { a: 0 , b: { c: 0}};
-  let obj3 = JSON.parse(JSON.stringify(obj1));
-  obj1.a = 4;
-  obj1.b.c = 4;
-  console.log(JSON.stringify(obj3)); // { "a": 0, "b": { "c": 0}}
-}
-
-test();
- -

オブジェクトの合成

- -
const o1 = { a: 1 };
-const o2 = { b: 2 };
-const o3 = { c: 3 };
-
-const obj = Object.assign(o1, o2, o3);
-console.log(obj); // { a: 1, b: 2, c: 3 }
-console.log(o1);  // { a: 1, b: 2, c: 3 }, コピー先オブジェクト自体が変化する
- -

同じプロパティを持つオブジェクトの合成

- -
const o1 = { a: 1, b: 1, c: 1 };
-const o2 = { b: 2, c: 2 };
-const o3 = { c: 3 };
-
-const obj = Object.assign({}, o1, o2, o3);
-console.log(obj); // { a: 1, b: 2, c: 3 }
- -

プロパティは、引数の順でより後にあるオブジェクトが同じプロパティを持っていると上書きされます。

- -

シンボル型のプロパティのコピー

- -
const o1 = { a: 1 };
-const o2 = { [Symbol('foo')]: 2 };
-
-const obj = Object.assign({}, o1, o2);
-console.log(obj); // { a : 1, [Symbol("foo")]: 2 } (cf. bug 1207182 on Firefox)
-Object.getOwnPropertySymbols(obj); // [Symbol(foo)]
-
- -

プロトタイプチェーン上のプロパティと列挙可能ではないプロパティはコピー不可

- -
const obj = Object.create({ foo: 1 }, { // foo は obj のプロトタイプチェーン
-  bar: {
-    value: 2  // bar は列挙可能ではないプロパティ
-  },
-  baz: {
-    value: 3,
-    enumerable: true  // bazは直接所有で列挙可能なプロパティ
-  }
-});
-
-const copy = Object.assign({}, obj);
-console.log(copy); // { baz: 3 }
-
- -

プリミティブはオブジェクトでラップされる

- -
const v1 = 'abc';
-const v2 = true;
-const v3 = 10;
-const v4 = Symbol('foo');
-
-const obj = Object.assign({}, v1, null, v2, undefined, v3, v4);
-// プリミティブ値はラップされ、 null と undefined は無視される
-// なお、文字列をラップした時だけ、直接所有で列挙可能なプロパティが存在する
-console.log(obj); // { "0": "a", "1": "b", "2": "c" }
-
- -

例外が発生すると実行中のコピー作業が中断される

- -
const target = Object.defineProperty({}, 'foo', {
-  value: 1,
-  writable: false
-}); // target.foo は読み取り専用のプロパティ
-
-Object.assign(target, { bar: 2 }, { foo2: 3, foo: 3, foo3: 3 }, { baz: 4 });
-// TypeError: "foo" is read-only
-// target.foo に代入しようとすると、この例外が発生する
-
-console.log(target.bar);  // 2, 一番目のコピー元オブジェクトはコピーされている
-console.log(target.foo2); // 3, 二番目のコピー元の最初のプロパティもコピーされている
-console.log(target.foo);  // 1, ここで例外が発生
-console.log(target.foo3); // undefined, assign メソッドが終了したので foo3 はコピーされない
-console.log(target.baz);  // undefined, 三番目のコピー元もコピーされない
-
- -

アクセサーのコピー

- -
var obj = {
-  foo: 1,
-  get bar() {
-    return 2;
-  }
-};
-
-let copy = Object.assign({}, obj);
-console.log(copy);
-// { foo: 1, bar: 2 }
-// copy.bar の値は obj.bar のゲッターの返値。
-
-// 記述子を完全にコピーする代入関数
-function completeAssign(target, ...sources) {
-  sources.forEach(source => {
-    let descriptors = Object.keys(source).reduce((descriptors, key) => {
-      descriptors[key] = Object.getOwnPropertyDescriptor(source, key);
-      return descriptors;
-    }, {});
-
-    // By default, Object.assign copies enumerable Symbols, too
-    Object.getOwnPropertySymbols(source).forEach(sym => {
-      let descriptor = Object.getOwnPropertyDescriptor(source, sym);
-      if (descriptor.enumerable) {
-        descriptors[sym] = descriptor;
-      }
-    });
-    Object.defineProperties(target, descriptors);
-  });
-  return target;
-}
-
-copy = completeAssign({}, obj);
-console.log(copy);
-// { foo:1, get bar() { return 2 } }
-
- -

仕様書

- - - - - - - - - - - - -
仕様書
{{SpecName('ESDraft', '#sec-object.assign', 'Object.assign')}}
- -

ブラウザーの互換性

- -

{{Compat("javascript.builtins.Object.assign")}}

- -

関連情報

- - diff --git a/files/ja/web/javascript/reference/global_objects/object/assign/index.md b/files/ja/web/javascript/reference/global_objects/object/assign/index.md new file mode 100644 index 0000000000..59acd67896 --- /dev/null +++ b/files/ja/web/javascript/reference/global_objects/object/assign/index.md @@ -0,0 +1,273 @@ +--- +title: Object.assign() +slug: Web/JavaScript/Reference/Global_Objects/Object/assign +tags: + - ECMAScript 2015 + - JavaScript + - Method + - Object + - Reference + - Polyfill +browser-compat: javascript.builtins.Object.assign +translation_of: Web/JavaScript/Reference/Global_Objects/Object/assign +--- +{{JSRef}} + +**`Object.assign()`** メソッドは、すべての{{jsxref("Object/propertyIsEnumerable", "列挙可能", "", 1)}}な{{jsxref("Object/hasOwnProperty", "自身のプロパティ", "", 1)}}の値を、 1 つ以上の*コピー元オブジェクト*から*コピー先オブジェクト*にコピーするために使用されます。変更されたコピー先オブジェクトを返します。 + +{{EmbedInteractiveExample("pages/js/object-assign.html")}} + +## 構文 + +```js +Object.assign(target, ...sources) +``` + +### 引数 + +- `target` + - : コピー先オブジェクト — コピー元のプロパティを適用するもので、変更後に返されます。 +- `sources` + - : コピー元オブジェクト (単数または複数) — 適用したいプロパティを含むオブジェクトです。 + +### 返値 + +コピー先オブジェクトです。 + +## 解説 + +コピー先オブジェクトのプロパティは、コピー元に同じ{{jsxref("Object/keys", "キー", "", 1)}}のプロパティがあると上書きされます。より後のコピー元のプロパティが、より前のものを同様に上書きします。 + +`Object.assign()` メソッドは、コピー元オブジェクトから*列挙可能 (enumerable)* かつ*直接所有 (own)* のプロパティだけをコピー先オブジェクトにコピーします。この際、コピー元オブジェクトには `{[[Get]]`、コピー先オブジェクトには `[[Set]]` を使いますので、[ゲッター](/ja/docs/Web/JavaScript/Reference/Functions/get)と[セッター](/ja/docs/Web/JavaScript/Reference/Functions/set)を呼び出すことになります。これはプロパティの*代入 (assign)* であり、プロパティをコピーしたり新しく定義したりするのとは異なります。そのため、コピー元にゲッターが存在する場合、新しいプロパティをプロトタイプにマージする用途には不適切でしょう。 + +プロパティ定義を (列挙可能属性も含めて) プロトタイプの中にコピーするには、このメソッドではなく {{jsxref("Object.getOwnPropertyDescriptor()")}} と {{jsxref("Object.defineProperty()")}} を使用してください。 + +{{jsxref("String")}} と {{jsxref("Symbol")}} の両方のプロパティがコピーされます。 + +エラーが発生した場合、例えばプロパティが書き込み不可の場合は、 {{jsxref("TypeError")}} が発生しますが、エラーが発生する前にプロパティが追加される場合、 `target` オブジェクトが変更されることがあります。 + +> **Note:** `Object.assign()` はコピー元の値が {{jsxref("null")}} や {{jsxref("undefined")}} でも例外を発生させません。 + +## ポリフィル + +この[ポリフィル](/ja/docs/Glossary/Polyfill)は、 ES5 にシンボルがないため、シンボルのプロパティに対応していません。 + +```js +if (typeof Object.assign !== 'function') { + // Must be writable: true, enumerable: false, configurable: true + Object.defineProperty(Object, "assign", { + value: function assign(target, varArgs) { // .length of function is 2 + 'use strict'; + if (target === null || target === undefined) { + throw new TypeError('Cannot convert undefined or null to object'); + } + + var to = Object(target); + + for (var index = 1; index < arguments.length; index++) { + var nextSource = arguments[index]; + + if (nextSource !== null && nextSource !== undefined) { + for (var nextKey in nextSource) { + // Avoid bugs when hasOwnProperty is shadowed + if (Object.prototype.hasOwnProperty.call(nextSource, nextKey)) { + to[nextKey] = nextSource[nextKey]; + } + } + } + } + return to; + }, + writable: true, + configurable: true + }); +} +``` + +## 例 + +### オブジェクトの複製 + +```js +const obj = { a: 1 }; +const copy = Object.assign({}, obj); +console.log(copy); // { a: 1 } +``` + +### 深い複製についての注意 + +`Object.assign()` はプロパティの値をコピーするため、深い複製を行うには別な方法を使用する必要があります。 + +元の値がオブジェクトへの参照である場合、参照の値のみをコピーするからです。 + +```js +function test() { + 'use strict'; + + let obj1 = { a: 0 , b: { c: 0}}; + let obj2 = Object.assign({}, obj1); + console.log(JSON.stringify(obj2)); // { "a": 0, "b": { "c": 0}} + + obj1.a = 1; + console.log(JSON.stringify(obj1)); // { "a": 1, "b": { "c": 0}} + console.log(JSON.stringify(obj2)); // { "a": 0, "b": { "c": 0}} + + obj2.a = 2; + console.log(JSON.stringify(obj1)); // { "a": 1, "b": { "c": 0}} + console.log(JSON.stringify(obj2)); // { "a": 2, "b": { "c": 0}} + + obj2.b.c = 3; + console.log(JSON.stringify(obj1)); // { "a": 1, "b": { "c": 3}} + console.log(JSON.stringify(obj2)); // { "a": 2, "b": { "c": 3}} + + // Deep Clone + obj1 = { a: 0 , b: { c: 0}}; + let obj3 = JSON.parse(JSON.stringify(obj1)); + obj1.a = 4; + obj1.b.c = 4; + console.log(JSON.stringify(obj3)); // { "a": 0, "b": { "c": 0}} +} + +test(); +``` + +### オブジェクトのマージ + +```js +const o1 = { a: 1 }; +const o2 = { b: 2 }; +const o3 = { c: 3 }; + +const obj = Object.assign(o1, o2, o3); +console.log(obj); // { a: 1, b: 2, c: 3 } +console.log(o1); // { a: 1, b: 2, c: 3 }, コピー先オブジェクト自体が変化する。 +``` + +### 同じプロパティを持つオブジェクトのマージ + +```js +const o1 = { a: 1, b: 1, c: 1 }; +const o2 = { b: 2, c: 2 }; +const o3 = { c: 3 }; + +const obj = Object.assign({}, o1, o2, o3); +console.log(obj); // { a: 1, b: 2, c: 3 } +``` + +プロパティは、引数の順でより後にあるオブジェクトが同じプロパティを持っていると上書きされます。 + +### シンボル型のプロパティのコピー + +```js +const o1 = { a: 1 }; +const o2 = { [Symbol('foo')]: 2 }; + +const obj = Object.assign({}, o1, o2); +console.log(obj); // { a : 1, [Symbol("foo")]: 2 } (cf. bug 1207182 on Firefox) +Object.getOwnPropertySymbols(obj); // [Symbol(foo)] +``` + +### プロトタイプチェーン上のプロパティと列挙可能ではないプロパティはコピー不可 + +```js +const obj = Object.create({ foo: 1 }, { // foo is on obj's prototype chain. + bar: { + value: 2 // bar は列挙可能なプロパティではない。 + }, + baz: { + value: 3, + enumerable: true // baz は直接所有で列挙可能なプロパティ。 + } +}); + +const copy = Object.assign({}, obj); +console.log(copy); // { baz: 3 } +``` + +### プリミティブはオブジェクトでラップされる + +```js +const v1 = 'abc'; +const v2 = true; +const v3 = 10; +const v4 = Symbol('foo'); + +const obj = Object.assign({}, v1, null, v2, undefined, v3, v4); +// プリミティブ値はラップされ、 null と undefined は無視される +// なお、文字列をラップした時だけ、直接所有で列挙可能なプロパティが存在する +console.log(obj); // { "0": "a", "1": "b", "2": "c" } +``` + +### 例外が発生すると実行中のコピー作業が中断される + +```js +const target = Object.defineProperty({}, 'foo', { + value: 1, + writable: false +}); // target.foo is a read-only property + +Object.assign(target, { bar: 2 }, { foo2: 3, foo: 3, foo3: 3 }, { baz: 4 }); +// TypeError: "foo" is read-only +// target.foo に代入しようとすると、この例外が発生する + +console.log(target.bar); // 2, 一番目のコピー元オブジェクトはコピーされている +console.log(target.foo2); // 3, 二番目のコピー元の最初のプロパティもコピーされている +console.log(target.foo); // 1, ここで例外が発生 +console.log(target.foo3); // undefined, assign メソッドが終了したので foo3 はコピーされない +console.log(target.baz); // undefined, 三番目のコピー元もコピーされない +``` + +### アクセサーのコピー + +```js +const obj = { + foo: 1, + get bar() { + return 2; + } +}; + +let copy = Object.assign({}, obj); +console.log(copy); +// { foo: 1, bar: 2 } +// copy.bar の値は obj.bar のゲッターの返値。 + +// 記述子を完全にコピーする代入関数 +function completeAssign(target, ...sources) { + sources.forEach(source => { + let descriptors = Object.keys(source).reduce((descriptors, key) => { + descriptors[key] = Object.getOwnPropertyDescriptor(source, key); + return descriptors; + }, {}); + +  // 既定では、 Object.assign は列挙可能なシンボルもコピーする + Object.getOwnPropertySymbols(source).forEach(sym => { + let descriptor = Object.getOwnPropertyDescriptor(source, sym); + if (descriptor.enumerable) { + descriptors[sym] = descriptor; + } + }); + Object.defineProperties(target, descriptors); + }); + return target; +} + +copy = completeAssign({}, obj); +console.log(copy); +// { foo:1, get bar() { return 2 } } +``` + +## 仕様書 + +{{Specifications}} + +## ブラウザーの互換性 + +{{Compat}} + +## 関連情報 + +- `Object.assign` のポリフィルは [`core-js`](https://github.com/zloirock/core-js#ecmascript-object) で利用できます +- {{jsxref("Object.defineProperties()")}} +- [プロパティの列挙可能性と所有権](/ja/docs/Web/JavaScript/Enumerability_and_ownership_of_properties) +- [オブジェクトリテラルでのスプレッド構文の使用](/ja/docs/Web/JavaScript/Reference/Operators/Spread_syntax#spread_in_object_literals) diff --git a/files/ja/web/javascript/reference/global_objects/object/constructor/index.html b/files/ja/web/javascript/reference/global_objects/object/constructor/index.html deleted file mode 100644 index 617c5cdfea..0000000000 --- a/files/ja/web/javascript/reference/global_objects/object/constructor/index.html +++ /dev/null @@ -1,255 +0,0 @@ ---- -title: Object.prototype.constructor -slug: Web/JavaScript/Reference/Global_Objects/Object/constructor -tags: - - JavaScript - - Object - - Property - - Prototype -translation_of: Web/JavaScript/Reference/Global_Objects/Object/constructor ---- -
{{JSRef}}
- -

constructor プロパティは、インスタンスオブジェクトを生成した {{jsxref("Object")}} のコンストラクター関数への参照を返します。なお、このプロパティの値は関数そのものへの参照であり、関数名を含んだ文字列ではありません。

- -

値が 1, true, "test" のようなプリミティブ値の場合は読み取り専用です。

- -

解説

- -

(Object.create(null) で生成されたオブジェクトを除いて) すべてのオブジェクトが constructor プロパティを持ちます。明示的にコンストラクター関数を用いることなく生成されたオブジェクト (オブジェクトリテラルや配列リテラルなど) は、 constructor プロパティがそのオブジェクトの基礎オブジェクトのコンストラクター型を指します。

- -
let o = {}
-o.constructor === Object // true
-
-let o = new Object
-o.constructor === Object // true
-
-let a = []
-a.constructor === Array // true
-
-let a = new Array
-a.constructor === Array // true
-
-let n = new Number(3)
-n.constructor === Number // true
-
- -

- -

オブジェクトのコンストラクターの表示

- -

以下の例では、コンストラクターである Tree と、その方のオブジェクトである theTree を生成します。そして、 theTree オブジェクトの constructor プロパティを表示します。

- -
function Tree(name) {
-  this.name = name
-}
-
-let theTree = new Tree('Redwood')
-console.log('theTree.constructor is ' + theTree.constructor)
-
- -

この例の出力は次のとおりです。

- -
theTree.constructor is function Tree(name) {
-  this.name = name
-}
-
- -

オブジェクトのコンストラクターの変更

- -

次の例は、一般的なオブジェクトのコンストラクターの値を変更する方法を示しています。 true, 1, "test" については、 (コンストラクターが読み取り専用のネイティブのものであるため) 影響を受けません。

- -

この例は、オブジェクトの constructor プロパティに頼ることが常に安全とは限らないことを示しています。

- -
function Type () {}
-
-let types = [
-  new Array(),
-  [],
-  new Boolean(),
-  true,             // 変わらない
-  new Date(),
-  new Error(),
-  new Function(),
-  function () {},
-  Math,
-  new Number(),
-  1,                // 変わらない
-  new Object(),
-  {},
-  new RegExp(),
-  /(?:)/,
-  new String(),
-  'test'            // 変わらない
-];
-
-for (let i = 0; i < types.length; i++) {
-  types[i].constructor = Type
-  types[i] = [types[i].constructor, types[i] instanceof Type, types[i].toString()]
-}
-
-console.log(types.join('\n'))
-
- -

この例の出力は次の通りです (参考にコメントを追加しています)。

- -
function Type() {},false,                                     // new Array()
-function Type() {},false,                                     // []
-function Type() {},false,false                                // new Boolean()
-function Boolean() {
-    [native code]
-},false,true                                                  // true
-function Type() {},false,Mon Sep 01 2014 16:03:49 GMT+0600    // new Date()
-function Type() {},false,Error                                // new Error()
-function Type() {},false,function anonymous() {
-
-}                                                             // new Function()
-function Type() {},false,function () {}                       // function () {}
-function Type() {},false,[object Math]                        // Math
-function Type() {},false,0                                    // new Number()
-function Number() {
-    [native code]
-},false,1                                                     // 1
-function Type() {},false,[object Object]                      // new Object()
-function Type() {},false,[object Object]                      // {}
-function Type() {},false,/(?:)/                               // new Regexp()
-function Type() {},false,/(?:)/                               // /(?:)/
-function Type() {},false,                                     // new String()
-function String() {
-    [native code]
-},false,test                                                  // 'test'
-
- -

関数のコンストラクターの変更

- -

多くの場合、このプロパティは new およびプロトタイプ継承チェーンで将来の呼び出しに使われる関数コンストラクターとしての関数の定義に使用されます。

- -
function Parent() { /* ... */ }
-Parent.prototype.parentMethod = function parentMethod() {}
-
-function Child() {
-   Parent.call(this) // Make sure everything is initialized properly
-}
-Child.prototype = Object.create(Parent.prototype) // Child のプロトタイプを Parent のプロトタイプで再定義
-
-Child.prototype.constructor = Child // Child の元のコンストラクターを復帰
- -

しかし、いつこの最後の行を実行する必要があるのでしょうか。残念ながら、正しい答えは、場合によるということです。

- -

元のコンストラクターを再割り当てすることが重要である場合と、これがコードの未使用の一行になる場合を定義してみましょう。

- -

以下の場合を見てみてください。オブジェクトが自分自身を生成するために create() メソッドを持っています。

- -
function Parent() { /* ... */ }
-function CreatedConstructor() {
-   Parent.call(this)
-}
-
-CreatedConstructor.prototype = Object.create(Parent.prototype)
-
-CreatedConstructor.prototype.create = function create() {
-  return new this.constructor()
-}
-
-new CreatedConstructor().create().create() // TypeError undefined is not a function since constructor === Parent
- -

上記の例では、コンストラクターが Parent にリンクしているため、例外が発生します。

- -

これを防ぐには、利用したいことに必要なコンストラクターを割り当てるだけです。

- -
function Parent() { /* ... */ }
-function CreatedConstructor() { /* ... */ }
-
-CreatedConstructor.prototype = Object.create(Parent.prototype)
-CreatedConstructor.prototype.constructor = CreatedConstructor // sets the correct constructor for future use
-
-CreatedConstructor.prototype.create = function create() {
-  return new this.constructor()
-}
-
-new CreatedConstructor().create().create() // it's pretty fine
- -

これで、コンストラクターの変更が有用である理由が明確になりました。

- -

もう一つの例を考えてみましょう。

- -
function ParentWithStatic() {}
-
-ParentWithStatic.startPosition = { x: 0, y:0 } // Static member property
-ParentWithStatic.getStartPosition = function getStartPosition() {
-  return this.startPosition
-}
-
-function Child(x, y) {
-  this.position = {
-    x: x,
-    y: y
-  }
-}
-
-Child = Object.assign(ParentWithStatic)
-Child.prototype = Object.create(ParentWithStatic.prototype)
-Child.prototype.constructor = Child
-
-Child.prototype.getOffsetByInitialPosition = function getOffsetByInitialPosition() {
-  let position = this.position
-  let startPosition = this.constructor.getStartPosition() // error undefined is not a function, since the constructor is Child
-
-  return {
-    offsetX: startPosition.x - position.x,
-    offsetY: startPosition.y - position.y
-  }
-};
- -

この例では、正常に動作するように親のコンストラクターを維持するか、静的プロパティを子のコンストラクタに再割り当てする必要があります。

- -
...
-Child = Object.assign(ParentWithStatic) // Notice that we assign it before we create(...) a prototype below
-Child.prototype = Object.create(ParentWithStatic.prototype)
-...
-
- -

または、親コンストラクターの識別子を子コンストラクター関数の別のプロパティに代入し、そのプロパティを介してアクセスします。

- -
...
-Child.parentConstructor = ParentWithStatic
-Child.prototype = Object.create(ParentWithStatic.prototype)
-...
-   let startPosition = this.constructor.parentConstructor.getStartPosition()
-...
-
- -
-

まとめ: コンストラクターを手動で更新したり設定したりすると、異なる結果や混乱する結果を導くことがあります。これを防ぐためには、それぞれの場合に応じてコンストラクターの役割を定義することが必要です。多くの場合、コンストラクター使用されず、再割り当ての必要はありません。

-
- -

仕様書

- - - - - - - - - - - - -
仕様書
{{SpecName('ESDraft', '#sec-object.prototype.constructor', 'Object.prototype.constructor')}}
- -

ブラウザーの互換性

- -

{{Compat("javascript.builtins.Object.constructor")}}

- -

関連情報

- - - - diff --git a/files/ja/web/javascript/reference/global_objects/object/constructor/index.md b/files/ja/web/javascript/reference/global_objects/object/constructor/index.md new file mode 100644 index 0000000000..35ea5680f9 --- /dev/null +++ b/files/ja/web/javascript/reference/global_objects/object/constructor/index.md @@ -0,0 +1,224 @@ +--- +title: Object.prototype.constructor +slug: Web/JavaScript/Reference/Global_Objects/Object/constructor +tags: + - JavaScript + - Object + - Property + - Prototype +browser-compat: javascript.builtins.Object.constructor +translation_of: Web/JavaScript/Reference/Global_Objects/Object/constructor +--- +{{JSRef}} + +**`constructor`** プロパティは、インスタンスオブジェクトを生成した {{jsxref("Object")}} のコンストラクター関数への参照を返します。なお、このプロパティの値は*関数そのものへの参照*であり、関数名を含んだ文字列ではありません。 + +値が `1`, `true`, `"test"` のようなプリミティブ値の場合は読み取り専用です。 + +## 解説 + +(`Object.create(null)` で生成されたオブジェクトを除いて) すべてのオブジェクトが `constructor` プロパティを持っています。明示的にコンストラクター関数を用いることなく生成されたオブジェクト (オブジェクトリテラルや配列リテラルなど) は、 `constructor` プロパティがそのオブジェクトの基礎オブジェクトのコンストラクター型を指します。 + +```js +let o = {} +o.constructor === Object // true + +let o = new Object +o.constructor === Object // true + +let a = [] +a.constructor === Array // true + +let a = new Array +a.constructor === Array // true + +let n = new Number(3) +n.constructor === Number // true +``` + +## 例 + +### オブジェクトのコンストラクターの表示 + +以下の例では、コンストラクター (`Tree`) と、その型のオブジェクト (`theTree`) を生成します。そして、 `theTree` オブジェクトの `constructor` プロパティを表示します。 + +```js +function Tree(name) { + this.name = name +} + +let theTree = new Tree('Redwood') +console.log('theTree.constructor is ' + theTree.constructor) +``` + +この例の出力は次のとおりです。 + +```js +theTree.constructor is function Tree(name) { + this.name = name +} +``` + +### オブジェクトのコンストラクターの変更 + +`constructor` プロパティに代入することができるのは、対応するコンストラクター関数を持たない `null` および `undefined` 以外の値 (`String`、`Number`、`Boolean` など) ですが、プリミティブ値には変更が適用されません (例外は発生しません)。これは、プリミティブ値 (`null` と `undefined` を除く) にどのようなプロパティを設定しても効果がないのと同じ仕組みによるものです。つまり、このようなプリミティブをオブジェクトとして使用すると、対応するコンストラクターのインスタンスが生成され、文の実行後すぐに破棄されることになります。 + +```js +let val = null; +val.constructor = 1; //TypeError: var is null + +val = 'abc'; +val.constructor = Number; //val.constructor === String + +val.foo = 'bar'; //暗黙的に String('abc') のインスタンスが生成され、 foo プロパティに代入する +val.foo === undefined; //true になる。 String('abc') の新しいインスタンスがこの比較のために生成され、 foo プロパティがないため +``` + +つまり、上記のプリミティブ値を除いて、基本的に `constructor` プロパティの値を変更することができます。**なお、 `constructor` プロパティを変更しても、 instanceof 演算子には影響しません**。 + +```js +let a = []; +a.constructor = String +a.constructor === String // true +a instanceof String //false +a instanceof Array //true + +a = new Foo(); +a.constructor = 'bar' +a.constructor === 'bar' // true + +//etc. +``` + +オブジェクトが封印または凍結されていた場合は、変更の効果がなくなり、例外は発生しません。 + +```js +let a = Object.seal({}); +a.constructor = Number; +a.constructor === Object; //true +``` + +### 関数のコンストラクターの変更 + +多くの場合、このプロパティは**関数コンストラクター**としての関数の定義に使用され、将来の **new** およびプロトタイプ継承チェーンでの呼び出しに使われます。 + +```js +function Parent() { /* ... */ } +Parent.prototype.parentMethod = function parentMethod() {} + +function Child() { + Parent.call(this) // すべてが正しく初期化されていることを確認 +} +Child.prototype = Object.create(Parent.prototype) // 子のプロトタイプを親のプロトタイプで再定義 + +Child.prototype.constructor = Child // 元のコンストラクターとして Child を返す +``` + +しかし、いつこの最後の行を実行する必要があるのでしょうか。残念ながら、正しい答えは、*場合による*ということです。 + +元のコンストラクターを再割り当てすることが重要である場合と、これがコードの未使用の一行になる場合を定義してみましょう。 + +以下の場合を見てみてください。オブジェクトが自分自身を生成するために `create()` メソッドを持っています。 + +```js +function Parent() { /* ... */ } +function CreatedConstructor() { + Parent.call(this) +} + +CreatedConstructor.prototype = Object.create(Parent.prototype) + +CreatedConstructor.prototype.create = function create() { + return new this.constructor() +} + +new CreatedConstructor().create().create() // TypeError undefined is not a function since constructor === Parent +``` + +上記の例では、コンストラクターが Parent にリンクしているため、例外が発生します。 + +これを防ぐには、利用しようとしている必要なコンストラクターを代入するだけです。 + +```js +function Parent() { /* ... */ } +function CreatedConstructor() { /* ... */ } + +CreatedConstructor.prototype = Object.create(Parent.prototype) +CreatedConstructor.prototype.constructor = CreatedConstructor // 将来使用するために正しいコンストラクターを設定 + +CreatedConstructor.prototype.create = function create() { + return new this.constructor() +} + +new CreatedConstructor().create().create() // とてもよくなった +``` + +これで、コンストラクターの変更が有用である理由が明確になりました。 + +もう一つの例を考えてみましょう。 + +```js +function ParentWithStatic() {} + +ParentWithStatic.startPosition = { x: 0, y:0 } // Static member property +ParentWithStatic.getStartPosition = function getStartPosition() { + return this.startPosition +} + +function Child(x, y) { + this.position = { + x: x, + y: y + } +} + +Child = Object.assign(Child, ParentWithStatic) // 静的メンバーを ParentWithStatic から Child へコピー +Child.prototype = Object.create(ParentWithStatic.prototype) +Child.prototype.constructor = Child + +Child.prototype.getOffsetByInitialPosition = function getOffsetByInitialPosition() { + let position = this.position + let startPosition = this.constructor.getStartPosition() // error undefined is not a function, since the constructor is Child + + return { + offsetX: startPosition.x - position.x, + offsetY: startPosition.y - position.y + } +}; +``` + +この例では、正常に動作するように親のコンストラクターを維持するか、静的プロパティを子のコンストラクタに再代入する必要があります。 + +```js +... +Child = Object.assign(Child, ParentWithStatic) // Notice that we assign it before we create(...) a prototype below +Child.prototype = Object.create(ParentWithStatic.prototype) +... +``` + +または、親コンストラクターの識別子を子コンストラクター関数の別のプロパティに代入し、そのプロパティを介してアクセスします。 + +```js +... +Child.parentConstructor = ParentWithStatic +Child.prototype = Object.create(ParentWithStatic.prototype) +... + let startPosition = this.constructor.parentConstructor.getStartPosition() +... +``` + +> **Note:** コンストラクターを手動で更新したり設定したりすると、異なる結果や混乱する結果を導くことがあります。これを防ぐためには、それぞれの場合に応じて `constructor` の役割を定義することが必要です。多くの場合、 `constructor` 使用されず、再割り当ての必要はありません。 + +## 仕様書 + +{{Specifications}} + +## ブラウザーの互換性 + +{{Compat}} + +## 関連情報 + +- {{jsxref("statements/class","クラス宣言","",1)}} +- {{jsxref("Classes/constructor","クラスのコンストラクター","",1)}} +- 用語集: {{Glossary("constructor", "コンストラクター", 1)}} diff --git a/files/ja/web/javascript/reference/global_objects/object/index.html b/files/ja/web/javascript/reference/global_objects/object/index.html deleted file mode 100644 index a0ae720ffd..0000000000 --- a/files/ja/web/javascript/reference/global_objects/object/index.html +++ /dev/null @@ -1,285 +0,0 @@ ---- -title: Object -slug: Web/JavaScript/Reference/Global_Objects/Object -tags: - - Constructor - - JavaScript - - Object - - コンストラクター -translation_of: Web/JavaScript/Reference/Global_Objects/Object ---- -
{{JSRef}}
- -

Object クラスは JavaScript のデータ型の一つを表します。これは様々なキー付きコレクションとより複雑な実態を格納するために使用されます。Object は {{jsxref("Object/Object", "Object()")}} コンストラクターまたはオブジェクト初期化子/リテラル構文を使用して生成することができます。

- -

解説

- -

JavaScript のほぼすべてのオブジェクトが {{jsxref("Object")}} のインスタンスです。一般的なオブジェクトは、プロパティを (メソッドを含めて) Object.prototype から継承していますが、これらのプロパティはシャドウ化 (別名オーバーライド) されている場合があります。しかし、意図的にそうではない Object を生成したり (例えば {{jsxref("Object.create", "Object.create(null)")}} によって)、変更した結果そうではなくなる場合 (例えば {{jsxref("Object.setPrototypeOf")}}) もあります。

- -

Object プロトタイプオブジェクトへの変更は、その変更の対象となるプロパティやメソッドがプロトタイプチェーンに沿ってさらにオーバーライドされない限り、プロトタイプチェーンを通してすべてのオブジェクトに表示されます。これはとても強力ですが、オブジェクトの動作をオーバーライドしたり拡張したりするのは潜在的に危険をはらむ仕組みでもあります。

- -

Object コンストラクターは、指定された値のオブジェクトラッパーを生成します。

- - - -

コンストラクター以外のコンテキストで呼び出された場合、Objectnew Object() と同等に動作します。

- -

オブジェクト初期化子/リテラル構文も参照してください。

- -

オブジェクトからプロパティを削除する

- -

オブジェクト自体には、自身のプロパティを削除するメソッドはありません ( {{jsxref("Map.prototype.delete", "Map.prototype.delete()")}}) など)。これを行うには、delete 演算子を使用する必要があります。

- -

コンストラクター

- -
-
{{jsxref("Object/Object", "Object()")}}
-
Object コンストラクターは指定された値のオブジェクトラッパーを生成します。
-
- -

静的メソッド

- -
-
{{jsxref("Object.assign","Object.assign()")}}
-
1 個以上のソースオブジェクトから、自身の列挙可能なプロパティの値をすべてターゲットオブジェクトにコピーします。
-
{{jsxref("Object.create","Object.create()")}}
-
指定されたプロトタイプオブジェクトとプロパティから、新しいオブジェクトを生成します。
-
{{jsxref("Object.defineProperty","Object.defineProperty()")}}
-
指定された記述子で記述された名前付きプロパティをオブジェクトへ追加します。
-
{{jsxref("Object.defineProperties","Object.defineProperties()")}}
-
指定された記述子で記述された複数の名前付きプロパティをオブジェクトへ追加します。
-
{{jsxref("Object.entries","Object.entries()")}}
-
指定したオブジェクトの自身の列挙可能な文字列プロパティのすべての [key, value] ペアを含む配列を返します。
-
{{jsxref("Object.freeze","Object.freeze()")}}
-
オブジェクトを凍結します。他のコードがプロパティを削除したり変更したりすることができなくなります。
-
{{jsxref("Object.fromEntries","Object.fromEntries()")}}
-
反復可能な [key, value] の組から新しいオブジェクトを返します。(これは {{jsxref("Object.entries")}} の逆です。)
-
{{jsxref("Object.getOwnPropertyDescriptor","Object.getOwnPropertyDescriptor()")}}
-
オブジェクトの名前付きプロパティに対応するプロパティ記述子を返します。
-
{{jsxref("Object.getOwnPropertyDescriptors","Object.getOwnPropertyDescriptors()")}}
-
オブジェクトの自身のすべてのプロパティの記述子を含むオブジェクトを返します。
-
{{jsxref("Object.getOwnPropertyNames","Object.getOwnPropertyNames()")}}
-
指定したオブジェクトの自身の列挙可能および列挙不可なすべてのプロパティの名前を、配列として返します。
-
{{jsxref("Object.getOwnPropertySymbols","Object.getOwnPropertySymbols()")}}
-
指定したオブジェクト上に直接存在するすべてのシンボルプロパティからなる配列を返します。
-
{{jsxref("Object.getPrototypeOf","Object.getPrototypeOf()")}}
-
指定されたオブジェクトのプロトタイプ (内部の [[Prototype]] プロパティ) を返します。
-
{{jsxref("Object.is","Object.is()")}}
-
二つの値が同じ値であるかどうかを比較します。NaN 値はすべて同じとして扱われます (抽象的等価比較とも厳密等価比較とも異なります)。
-
{{jsxref("Object.isExtensible","Object.isExtensible()")}}
-
オブジェクトの拡張が許可されているかどうかを判定します。
-
{{jsxref("Object.isFrozen","Object.isFrozen()")}}
-
オブジェクトが凍結されているかどうかを判定します。
-
{{jsxref("Object.isSealed","Object.isSealed()")}}
-
オブジェクトが封印されているかどうかを判定します。
-
{{jsxref("Object.keys","Object.keys()")}}
-
指定されたオブジェクト自身の列挙可能なプロパティの名前をすべて含む配列を返します。
-
{{jsxref("Object.preventExtensions","Object.preventExtensions()")}}
-
オブジェクトに対するあらゆる拡張を禁止します。
-
{{jsxref("Object.seal","Object.seal()")}}
-
オブジェクトを封印し、オブジェクトのプロパティの削除を禁止します。
-
{{jsxref("Object.setPrototypeOf","Object.setPrototypeOf()")}}
-
プロトタイプ (内部の [[Prototype]] プロパティ) を設定します。
-
{{jsxref("Object.values","Object.values()")}}
-
指定したオブジェクトの自身の列挙可能な文字列プロパティのすべてに対応する値を含む配列を返します。
-
- -

インスタンスプロパティ

- -
-
-
{{jsxref("Object.prototype.constructor")}}
-
オブジェクトのプロトタイプを生成する関数を指定します。
-
{{jsxref("Object.prototype.__proto__")}}
-
オブジェクトがインスタンス化されたとき、プロトタイプとして使用されたオブジェクトを指します。
-
{{jsxref("Object.prototype.__noSuchMethod__")}}
-
未定義のオブジェクトメンバーがメソッドとして呼び出された際に実行される関数を定義します。
-
-
- -

インスタンスメソッド

- -
-
-
{{jsxref("Object.prototype.__defineGetter__()")}}
-
指定したプロパティに、アクセスの際に実行されて戻り値を返す関数を関連付けます。
-
{{jsxref("Object.prototype.__defineSetter__()")}}
-
指定したプロパティに、設定の際に実行されてプロパティを変更する関数を関連付けます。
-
{{jsxref("Object.prototype.__lookupGetter__()")}}
-
{{jsxref("Object.prototype.__defineGetter__()", "__defineGetter__()")}} メソッドによって特定のプロパティに関連付けされた関数を返します。
-
{{jsxref("Object.prototype.__lookupSetter__()")}}
-
{{jsxref("Object.prototype.__defineSetter__()", "__defineSetter__()")}} メソッドによって特定のプロパティに関連付けされた関数を返します。
-
{{jsxref("Object.prototype.hasOwnProperty()")}}
-
指定したプロパティが、プロトタイプチェーンを通じて継承されたものではなくオブジェクトが直接持っているプロパティかどうかを示す真偽値を返します。
-
{{jsxref("Object.prototype.isPrototypeOf()")}}
-
指定したオブジェクトが、このメソッドを呼び出した元であるオブジェクトのプロトタイプチェーンにあるかどうかを示す真偽値を返します。
-
{{jsxref("Object.prototype.propertyIsEnumerable()")}}
-
内部の ECMAScript [[Enumerable]] 属性 の設定状態を示す真偽値を返します。
-
{{jsxref("Object.prototype.toSource()")}}
-
このメソッドの呼び出し元オブジェクトを表すオブジェクトリテラルからなるソース文字列を返します。この値を使って新しいオブジェクトを作成できます。
-
{{jsxref("Object.prototype.toLocaleString()")}}
-
{{jsxref("Object.toString", "toString()")}} を呼び出します。
-
{{jsxref("Object.prototype.toString()")}}
-
指定したオブジェクトを表す文字列を返します。
-
{{jsxref("Object.prototype.unwatch()")}}
-
オブジェクトのプロパティから代入処理を監視するウォッチポイントを取り除きます。
-
{{jsxref("Object.prototype.valueOf()")}}
-
指定したオブジェクトのプリミティブ値を返します。
-
{{jsxref("Object.prototype.watch()")}}
-
オブジェクトのプロパティに代入処理を監視するウォッチポイントを追加します。
-
-
- -

- -

undefinednull データ型を与えられた Object を使用する

- -

次の例は、o に空の Object オブジェクトを格納します。

- -
let o = new Object()
-
- -
let o = new Object(undefined)
-
- -
let o = new Object(null)
-
- -

Boolean オブジェクトの生成に Object を使用する

- -

次の例は、o に {{jsxref("Boolean")}} オブジェクトを格納します。

- -
// o = new Boolean(true) に同じ
-let o = new Object(true)
-
- -
// to o = new Boolean(false) に同じ
-let o = new Object(Boolean())
-
- -

オブジェクトのプロトタイプ

- -

Object.prototype の既存のメソッドの動作を変更する場合は、既存のロジックの前または後で独自の拡張を囲む形でコードを挿入するようにしてください。例えば、この (テストされていない) コードは、組込みロジックや誰かの拡張機能が実行される前に、条件付きで独自のロジックを実行します。

- -

関数が呼び出されると、呼び出す引数は配列状「変数」 arguments に保持されます。例えば myFn(a, b, c) の呼び出しでは、myFn の本体内での引数は (a, b, c) に対応する 3 つの配列状要素を含みます。

- -

フックを使ってプロトタイプを変更する場合は、関数で apply() を呼び出すことで、this と引数 (呼び出し状態) を現在の動作に渡します。このパターンは、Node.prototypeFunction.prototype など、どんなプロトタイプにも使えます。

- -
var current = Object.prototype.valueOf;
-
-// Since my property "-prop-value" is cross-cutting and isn't always
-// on the same prototype chain, I want to modify Object.prototype:
-Object.prototype.valueOf = function() {
-  if (this.hasOwnProperty('-prop-value')) {
-    return this['-prop-value'];
-  } else {
-    // It doesn't look like one of my objects, so let's fall back on
-    // the default behavior by reproducing the current behavior as best we can.
-    // The apply behaves like "super" in some other languages.
-    // Even though valueOf() doesn't take arguments, some other hook may.
-    return current.apply(this, arguments);
-  }
-}
-
- -

JavaScript はサブクラスオブジェクトを持っていないため、プロトタイプはオブジェクトとして機能する特定の関数の「基本クラス」オブジェクトを作成するための有用な回避策です。例えば、以下のようになります。

- -
var Person = function(name) {
-  this.name = name;
-  this.canTalk = true;
-};
-
-Person.prototype.greet = function() {
-  if (this.canTalk) {
-    console.log('Hi, I am ' + this.name);
-  }
-};
-
-var Employee = function(name, title) {
-  Person.call(this, name);
-  this.title = title;
-};
-
-Employee.prototype = Object.create(Person.prototype);
-Employee.prototype.constructor = Employee; //If you don't set Object.prototype.constructor to Employee,
-                                           //it will take prototype.constructor of Person (parent).
-                                           //To avoid that, we set the prototype.constructor to Employee (child).
-
-
-Employee.prototype.greet = function() {
-  if (this.canTalk) {
-    console.log('Hi, I am ' + this.name + ', the ' + this.title);
-  }
-};
-
-var Customer = function(name) {
-  Person.call(this, name);
-};
-
-Customer.prototype = Object.create(Person.prototype);
-Customer.prototype.constructor = Customer; //If you don't set Object.prototype.constructor to Customer,
-                                           //it will take prototype.constructor of Person (parent).
-                                           //To avoid that, we set the prototype.constructor to Customer (child).
-
-
-var Mime = function(name) {
-  Person.call(this, name);
-  this.canTalk = false;
-};
-
-Mime.prototype = Object.create(Person.prototype);
-Mime.prototype.constructor = Mime; //If you don't set Object.prototype.constructor to Mime,
-                                   //it will take prototype.constructor of Person (parent).
-                                   //To avoid that, we set the prototype.constructor to Mime (child).
-
-
-var bob = new Employee('Bob', 'Builder');
-var joe = new Customer('Joe');
-var rg = new Employee('Red Green', 'Handyman');
-var mike = new Customer('Mike');
-var mime = new Mime('Mime');
-
-bob.greet();
-// Hi, I am Bob, the Builder
-
-joe.greet();
-// Hi, I am Joe
-
-rg.greet();
-// Hi, I am Red Green, the Handyman
-
-mike.greet();
-// Hi, I am Mike
-
-mime.greet();
- -

仕様

- - - - - - - - - - - - -
仕様書
{{SpecName('ESDraft', '#sec-object-objects', 'Object')}}
- -

ブラウザーの互換性

- -
-

{{Compat("javascript.builtins.Object")}}

-
- -

関連情報

- - diff --git a/files/ja/web/javascript/reference/global_objects/object/index.md b/files/ja/web/javascript/reference/global_objects/object/index.md new file mode 100644 index 0000000000..7f242b9126 --- /dev/null +++ b/files/ja/web/javascript/reference/global_objects/object/index.md @@ -0,0 +1,253 @@ +--- +title: Object +slug: Web/JavaScript/Reference/Global_Objects/Object +tags: + - Class + - JavaScript + - Object +browser-compat: javascript.builtins.Object +translation_of: Web/JavaScript/Reference/Global_Objects/Object +--- +{{JSRef}} + +**`Object`** クラスは [JavaScript のデータ型](/ja/docs/Web/JavaScript/Data_structures)の一つを表します。これは様々なキー付きコレクションとより複雑な実態を格納するために使用されます。 Object は {{jsxref("Object/Object", "Object()")}} コンストラクターまたは[オブジェクト初期化子/リテラル構文](/ja/docs/Web/JavaScript/Reference/Operators/Object_initializer)を使用して生成することができます。 + +## 解説 + +JavaScript のほぼすべてのオブジェクトが {{jsxref("Object")}} のインスタンスです。一般的なオブジェクトは、プロパティを (メソッドを含めて) Object.prototype から継承していますが、これらのプロパティはシャドウ化 (別名オーバーライド) されている場合があります。しかし、意図的にそうではない `Object` を生成したり (例えば {{jsxref("Object.create", "Object.create(null)")}} によって)、変更した結果そうではなくなる場合 (例えば {{jsxref("Object.setPrototypeOf")}}) もあります。 + +`Object` プロトタイプオブジェクトへの変更は、その変更の対象となるプロパティやメソッドがプロトタイプチェーンに沿ってさらにオーバーライドされない限り、プロトタイプチェーンを通して**すべての**オブジェクトに反映されます。これはとても強力ですが、オブジェクトの動作をオーバーライドしたり拡張したりするのは潜在的に危険をはらむ仕組みでもあります。 + +`Object` コンストラクターは、指定された値のオブジェクトラッパーを生成します。 + +- 値が {{jsxref("null")}} または {{jsxref("undefined")}} である場合、空のオブジェクトを生成して返します。 +- それ以外の場合は、与えられた値に関連する型のオブジェクトを返します。 +- 値がすでにオブジェクトであった場合は、その値を返します。 + +コンストラクター以外のコンテキストで呼び出された場合、 `Object` は `new Object()` と同等に動作します。 + +[オブジェクト初期化子/リテラル構文](/ja/docs/Web/JavaScript/Reference/Operators/Object_initializer)も参照してください。 + +### オブジェクトからのプロパティの削除 + +オブジェクト自体には、自身のプロパティを削除するメソッド ({{jsxref("Map.prototype.delete", "Map.prototype.delete()")}} のようなもの) はありません。これを行うには、[delete 演算子](/ja/docs/Web/JavaScript/Reference/Operators/delete)を使用する必要があります。 + +## コンストラクター + +- {{jsxref("Object/Object", "Object()")}} + - : 新しい `Object` オブジェクトを生成します。これは指定された値のラッパーです。 + +## 静的メソッド + +- {{jsxref("Object.assign","Object.assign()")}} + - : 1 個以上のソースオブジェクトから、自身の列挙可能なプロパティの値をすべてターゲットオブジェクトにコピーします。 +- {{jsxref("Object.create","Object.create()")}} + - : 指定されたプロトタイプオブジェクトとプロパティから、新しいオブジェクトを生成します。 +- {{jsxref("Object.defineProperty","Object.defineProperty()")}} + - : 指定された記述子で記述された名前付きプロパティをオブジェクトへ追加します。 +- {{jsxref("Object.defineProperties","Object.defineProperties()")}} + - : 指定された記述子で記述された複数の名前付きプロパティをオブジェクトへ追加します。 +- {{jsxref("Object.entries","Object.entries()")}} + - : 指定されたオブジェクト**自身**の列挙可能な文字列プロパティのすべての `[key, value]` の組を含む配列を返します。 +- {{jsxref("Object.freeze","Object.freeze()")}} + - : オブジェクトを凍結します。他のコードがプロパティを削除したり変更したりすることができなくなります。 +- {{jsxref("Object.fromEntries","Object.fromEntries()")}} + - : 反復可能な `[key, value]` の組から新しいオブジェクトを返します。(これは {{jsxref("Object.entries")}} の逆です。) +- {{jsxref("Object.getOwnPropertyDescriptor","Object.getOwnPropertyDescriptor()")}} + - : オブジェクトの名前付きプロパティに対応するプロパティ記述子を返します。 +- {{jsxref("Object.getOwnPropertyDescriptors","Object.getOwnPropertyDescriptors()")}} + - : オブジェクト自身のすべてのプロパティの記述子を含むオブジェクトを返します。 +- {{jsxref("Object.getOwnPropertyNames","Object.getOwnPropertyNames()")}} + - : 指定したオブジェクト**自身**の列挙可能および列挙不可なすべてのプロパティの名前を、配列として返します。 +- {{jsxref("Object.getOwnPropertySymbols","Object.getOwnPropertySymbols()")}} + - : 指定したオブジェクト上に直接存在するすべてのシンボルプロパティからなる配列を返します。 +- {{jsxref("Object.getPrototypeOf","Object.getPrototypeOf()")}} + - : 指定されたオブジェクトのプロトタイプ (内部の `[[Prototype]]` プロパティ) を返します。 +- {{jsxref("Object.is","Object.is()")}} + - : 二つの値が同じ値であるかどうかを比較します。 `NaN` 値はすべて同じものとして扱われます (抽象的等価比較とも厳密等価比較とも異なります)。 +- {{jsxref("Object.isExtensible","Object.isExtensible()")}} + - : オブジェクトの拡張が許可されているかどうかを判定します。 +- {{jsxref("Object.isFrozen","Object.isFrozen()")}} + - : オブジェクトが凍結されているかどうかを判定します。 +- {{jsxref("Object.isSealed","Object.isSealed()")}} + - : オブジェクトが封印されているかどうかを判定します。 +- {{jsxref("Object.keys","Object.keys()")}} + - : 指定されたオブジェクト**自身**の列挙可能なプロパティの名前をすべて含む配列を返します。 +- {{jsxref("Object.preventExtensions","Object.preventExtensions()")}} + - : オブジェクトのあらゆる拡張を抑止します。 +- {{jsxref("Object.seal","Object.seal()")}} + - : オブジェクトのプロパティを削除するほかのコードを抑止します。 +- {{jsxref("Object.setPrototypeOf","Object.setPrototypeOf()")}} + - : オブジェクトのプロトタイプ (内部の `[[Prototype]]` プロパティ) を設定します。 +- {{jsxref("Object.values","Object.values()")}} + - : 与えられたオブジェクト**自身**の列挙可能な文字列プロパティすべてに対応する値を含む配列を返します。 + +## インスタンスプロパティ + +- {{jsxref("Object.prototype.constructor")}} + - : オブジェクトのプロトタイプを生成する関数を指定します。 +- {{jsxref("Object/proto","Object.prototype.__proto__")}} + - : オブジェクトがインスタンス化されたとき、プロトタイプとして使用されたオブジェクトを指します。 + +## インスタンスメソッド + +- {{jsxref("Object.prototype.__defineGetter__()")}} + - : 関数をプロパティに関連付けます。そのプロパティにアクセスすると、その関数を実行して返値を返すようにします。 +- {{jsxref("Object.prototype.__defineSetter__()")}} + - : 関数をプロパティに関連付け、設定されるとプロパティを変更する関数を実行するようにします。 +- {{jsxref("Object.prototype.__lookupGetter__()")}} + - : {{jsxref("Object.prototype.__defineGetter__()", "__defineGetter__()")}} メソッドによって特定のプロパティに関連付けされた関数を返します。 +- {{jsxref("Object.prototype.__lookupSetter__()")}} + - : {{jsxref("Object.prototype.__defineSetter__()", "__defineSetter__()")}} メソッドによって特定のプロパティに関連付けされた関数を返します。 +- {{jsxref("Object.prototype.hasOwnProperty()")}} + - : オブジェクトが、プロトタイプチェーンを通じて継承されたものではなくオブジェクトの直接のプロパティを持っているかどうかを示す論理値を返します。 +- {{jsxref("Object.prototype.isPrototypeOf()")}} + - : このメソッドが呼び出されたオブジェクトが、指定されたオブジェクトのプロトタイプチェーンにあるかどうかを示す論理値を返します。 +- {{jsxref("Object.prototype.propertyIsEnumerable()")}} + - : 内部の [ECMAScript \[\[Enumerable\]\] 属性](/ja/docs/Web/JavaScript/Data_structures#properties)が設定されているかどうかを表す論理値を返します。 +- {{jsxref("Object.prototype.toLocaleString()")}} + - : {{jsxref("Object.toString", "toString()")}} を呼び出します。 +- {{jsxref("Object.prototype.toString()")}} + - : そのオブジェクトの文字列表現を返します。 +- {{jsxref("Object.prototype.valueOf()")}} + - : 指定されたオブジェクトのプリミティブ値を返します。 + +## 例 + +### `undefined` や `null` 型を指定して `Object` を使用 + +以下の例は、空の `Object` オブジェクトを `o` に格納します。 + +```js +let o = new Object() +``` + +```js +let o = new Object(undefined) +``` + +```js +let o = new Object(null) +``` + +### `Object` を使用して `Boolean` オブジェクトを生成 + +以下の例は、 {{jsxref("Boolean")}} オブジェクトを `o` に格納します。 + +```js +// o = new Boolean(true) と同じ +let o = new Object(true) +``` + +```js +// o = new Boolean(false) と同じ +let o = new Object(Boolean()) +``` + +### オブジェクトのプロトタイプ + +`Object.prototype` の既存のメソッドの動作を変更するには、既存のロジックの前または後で独自の拡張を囲む形でコードを挿入するようにしてください。例えば、この (テストされていない) コードは、組み込みロジックや誰かの拡張機能が実行される前に、条件付きで独自のロジックを実行します。 + +関数が呼び出されると、呼び出す引数は配列風の「変数」 [arguments](/ja/docs/Web/JavaScript/Reference/Functions/arguments) に保持されます。例えば `myFn(a, b, c)` の呼び出しでは、`myFn` の本体内での引数は `(a, b, c)` に対応する 3 つのの要素を含みます。 + +フックを使ってプロトタイプを変更する場合は、関数で `apply()` を呼び出すことで、 `this` と引数 (呼び出し状態) を現在の動作に渡します。このパターンは、`Node.prototype` や `Function.prototype` など、どんなプロトタイプにも使えます。 + +```js +var current = Object.prototype.valueOf; + +// プロパティ "-prop-value" は横断的で、同じプロトタイプチェーン上に +// あるとは限らないので、 Object.prototype を修正したいと思います。 +Object.prototype.valueOf = function() { + if (this.hasOwnProperty('-prop-value')) { + return this['-prop-value']; + } else { + // 私のオブジェクトのようには見えないので、現在の動作をできる限り再現して、 + // 既定の動作にフォールバックします。 + // apply は、他のいくつかの言語における "super" のような動作をします。 + // valueOf() は引数を取りませんが、他のフックによっては取るかもしれません。 + return current.apply(this, arguments); + } +} +``` + +正確には JavaScript にはサブクラスのオブジェクトが存在しないので、プロトタイプは下記の例のように、オブジェクトとして動作する特定の関数の「基本クラス」オブジェクトを作るための有用な回避策となります。 + +```js +var Person = function(name) { + this.name = name; + this.canTalk = true; +}; + +Person.prototype.greet = function() { + if (this.canTalk) { + console.log('Hi, I am ' + this.name); + } +}; + +var Employee = function(name, title) { + Person.call(this, name); + this.title = title; +}; + +Employee.prototype = Object.create(Person.prototype); +Employee.prototype.constructor = Employee; // Object.prototype.constructor を Employee に設定しないと、 + // Person (親) の prototype.constructor を取ってしまいます。 + //それを避けるために prototype.constructor を Employee (子) に設定しています。 + +Employee.prototype.greet = function() { + if (this.canTalk) { + console.log('Hi, I am ' + this.name + ', the ' + this.title); + } +}; + +var Customer = function(name) { + Person.call(this, name); +}; + +Customer.prototype = Object.create(Person.prototype); +Customer.prototype.constructor = Customer; // Object.prototype.constructor を Customer に設定しないと、 + // Person (親) の prototype.constructor を取ってしまいます。 + //それを避けるために prototype.constructor を Employee (子) に設定しています。 + +var Mime = function(name) { + Person.call(this, name); + this.canTalk = false; +}; + +Mime.prototype = Object.create(Person.prototype); +Mime.prototype.constructor = Mime; // Object.prototype.constructor を Mime に設定しないと、 + // Person (親) の prototype.constructor を取ってしまいます。 + //それを避けるために prototype.constructor を Employee (子) に設定しています。 + +var bob = new Employee('Bob', 'Builder'); +var joe = new Customer('Joe'); +var rg = new Employee('Red Green', 'Handyman'); +var mike = new Customer('Mike'); +var mime = new Mime('Mime'); + +bob.greet(); +// Hi, I am Bob, the Builder + +joe.greet(); +// Hi, I am Joe + +rg.greet(); +// Hi, I am Red Green, the Handyman + +mike.greet(); +// Hi, I am Mike + +mime.greet(); +``` + +## 仕様書 + +{{Specifications}} + +## ブラウザーの互換性 + +{{Compat}} + +## 関連情報 + +- [オブジェクト初期化子](/ja/docs/Web/JavaScript/Reference/Operators/Object_initializer) diff --git a/files/ja/web/javascript/reference/global_objects/object/object/index.html b/files/ja/web/javascript/reference/global_objects/object/object/index.html deleted file mode 100644 index ba1f927af0..0000000000 --- a/files/ja/web/javascript/reference/global_objects/object/object/index.html +++ /dev/null @@ -1,82 +0,0 @@ ---- -title: Object() コンストラクター -slug: Web/JavaScript/Reference/Global_Objects/Object/Object -tags: - - Constructor - - JavaScript - - Object - - Reference -translation_of: Web/JavaScript/Reference/Global_Objects/Object/Object ---- -
{{JSRef}}
- -

Object コンストラクターは、与えられた値のオブジェクトラッパーを生成します。

- - - -

コンストラクターではない場面で Object が呼び出された場合は、 new Object() と同様に動作します。

- -

構文

- -
new Object()
-new Object(value)
- -

引数

- -
-
value
-
任意の値。
-
- -

- -

新しい Object の生成

- -
let o = new Object()
-o.foo = 42
-
-console.log(o)
-// Object { foo: 42 }
- -

undefined および null 型が与えられた Object の使用

- -

次の例は、空の Object オブジェクトを o に格納します。

- -
let o = new Object()
-
- -
let o = new Object(undefined)
-
- -
let o = new Object(null)
- -

仕様書

- - - - - - - - - - - - -
仕様書
{{SpecName('ESDraft', '#sec-object-constructor', 'Object constructor')}}
- -

ブラウザーの互換性

- -
-

{{Compat("javascript.builtins.Object.Object")}}

-
- -

関連情報

- - diff --git a/files/ja/web/javascript/reference/global_objects/object/object/index.md b/files/ja/web/javascript/reference/global_objects/object/object/index.md new file mode 100644 index 0000000000..74a4e9a301 --- /dev/null +++ b/files/ja/web/javascript/reference/global_objects/object/object/index.md @@ -0,0 +1,72 @@ +--- +title: Object() コンストラクター +slug: Web/JavaScript/Reference/Global_Objects/Object/Object +tags: + - Constructor + - JavaScript + - Object + - Reference +browser-compat: javascript.builtins.Object.Object +translation_of: Web/JavaScript/Reference/Global_Objects/Object/Object +--- +{{JSRef}} + +**`Object` コンストラクター**は、与えられた値のオブジェクトラッパーを生成します。 + +- その値が {{jsxref("null")}} または {{jsxref("undefined")}} である場合、空のオブジェクトを生成して返します。 +- そうでない場合は、与えらえた値に対応する型のオブジェクトを返します。 +- 値がすでにオブジェクトであった場合は、その値を返します。 + +コンストラクターではない場面で `Object` が呼び出された場合は、 `new Object()` と同様に動作します。 + +## 構文 + +```js +new Object() +new Object(value) +``` + +### 引数 + +- `value` + - : 任意の値。 + +## 例 + +### 新しい Object の生成 + +```js +let o = new Object() +o.foo = 42 + +console.log(o) +// Object { foo: 42 } +``` + +### `undefined` や `null` 型を指定して `Object` を使用 + +以下の例は、空の `Object` オブジェクトを `o` に格納します。 + +```js +let o = new Object() +``` + +```js +let o = new Object(undefined) +``` + +```js +let o = new Object(null) +``` + +## 仕様書 + +{{Specifications}} + +## ブラウザーの互換性 + +{{Compat}} + +## 関連情報 + +- [オブジェクト初期化子](/ja/docs/Web/JavaScript/Reference/Operators/Object_initializer) diff --git a/files/ja/web/javascript/reference/global_objects/object/proto/index.html b/files/ja/web/javascript/reference/global_objects/object/proto/index.html deleted file mode 100644 index c891c2d4a4..0000000000 --- a/files/ja/web/javascript/reference/global_objects/object/proto/index.html +++ /dev/null @@ -1,129 +0,0 @@ ---- -title: Object.prototype.__proto__ -slug: Web/JavaScript/Reference/Global_Objects/Object/proto -tags: - - Deprecated - - ECMAScript 2015 - - JavaScript - - Object - - Property - - Prototype - - Reference -translation_of: Web/JavaScript/Reference/Global_Objects/Object/proto ---- -
{{JSRef}}{{Deprecated_header}} -
-

警告: オブジェクトの [[Prototype]] を変更することは、最新の JavaScript エンジンがプロパティアクセスを最適化する仕組み上、すべてのブラウザーや JavaScript エンジンにおいて、とても低速な操作となります。プロトタイプの継承関係を変更することによる性能上の影響は微細で広範囲にわたり、単に obj.__proto__ = ... という文の実行時間に留まらず、 [[Prototype]] が変更されたいずれかのオブジェクトへのアクセスを持つあらゆるコードに及ぶ可能性があります。性能を気にしている場合、オブジェクトの [[Prototype]] の変更は避けるべきです。代わりに、 {{JSxRef("Object.create()")}} を使用して意図する [[Prototype]] をもつオブジェクトを新たに生成してください。

-
- -
-

警告: Object.prototype.__proto__ は現時点でほとんどのブラウザーが対応していますが、そのプロパティの存在と正確な動作は、ウェブブラウザーの互換性を確保するためのレガシー機能として、 ECMAScript 2015 で初めて標準化されました。代わりに {{JSxRef("Object.getPrototypeOf()")}} を使用してください。

-
-
- -

{{JSxRef("Object.prototype")}} の __proto__ プロパティは、アクセスされるオブジェクトの内部の [[Prototype]] (オブジェクトまたは {{JSxRef("Global_Objects/null", "null")}} のどちらか) を暴露するアクセサプロパティ (ゲッター関数とセッター関数) です。

- -

__proto__ の使用は、論争の的になり、推奨されていません。もともと ECMAScript 言語仕様には含まれていませんでしたが、現在のブラウザーでは結局それを実装しています。最近になって、 __proto__ プロパティはウェブブラウザー間の互換性を保つために ECMAScript2015 の仕様で標準化されたので、将来的には対応されることになります。これは非推奨扱いで、代わりに {{JSxRef("Object.getPrototypeOf")}}/{{JSxRef("Reflect.getPrototypeOf")}} および {{JSxRef("Object.setPrototypeOf")}}/{{JSxRef("Reflect.setPrototypeOf")}} を推奨しています (とはいえ、オブジェクトの [[Prototype]] の設定は、性能が気になる場合には避けるべき低速の操作ですが)。

- -

また、__proto__ プロパティは、生成時に [[Prototype]] オブジェクトを設定するために {{JSxRef("Object.create()")}} の代わりとしてもオブジェクトリテラルの定義で使用されます。参照: オブジェクト初期化子

- -

解説

- -

__proto__ ゲッター関数はオブジェクトの内部の [[Prototype]] の値を外部に公開します。オブジェクトリテラルを使用して生成されたオブジェクトでは、この値は {{JSxRef("Object.prototype")}} です。配列リテラルを使用して生成されたオブジェクトでは、この値は {{JSxRef("Array.prototype")}} です。関数では、この値は {{JSxRef("Function.prototype")}} です。 new fun を使用して生成されたオブジェクトでは、 fun が JavaScript の ({{JSxRef("Array")}}、{{JSxRef("Boolean")}}、{{JSxRef("Date")}}、 {{JSxRef("Number")}}、 {{JSxRef("Object")}}、 {{JSxRef("String")}} などによって提供された内蔵コンストラクター関数のうちの一つである場合は — JavaScript の進化によって追加された新しいコンストラクタを含みます)、この値は常に fun.prototype です。 new fun を使用して生成されたオブジェクトでは、 fun がスクリプトで定義された関数である場合、この値は常に fun.prototype の値です。 (すなわち、コンストラクターがほかのオブジェクトを明示的に返さない場合、または fun.prototype に再代入されていない場合)。

- -

__proto__ のセッターでオブジェクトの [[Prototype]] を変更することができます。オブジェクトは、 {{JSxRef("Object.isExtensible()")}} に応じて拡張可能である必要があります。拡張可能ではない場合、 {{JSxRef("Global_Objects/TypeError", "TypeError")}} が発生します。与えられた値はオブジェクト、または {{JSxRef("Global_Objects/null", "null")}} である必要があります。他の値が与えられた場合は何もしません。

- -

プロトタイプが継承のためにどのように使用されるかを理解するには、ガイド記事の継承とプロトタイプチェーンを参照してください。

- -

__proto__ プロパティは、ゲッター関数とセッター関数からなる {{JSxRef("Object.prototype")}} 上の簡単なアクセサープロパティです。最終的にの {{JSxRef("Object.prototype")}} を参照する __proto__ に対してのプロパティアクセスはこのプロパティを探します。しかし、 {{JSxRef("Object.prototype")}} を参照しないアクセスはこのプロパティを探しません。 {{JSxRef("Object.prototype")}} が参照される前にいくつかの他の __proto__ プロパティが見つけられた場合、そのプロパティは、 {{JSxRef("Object.prototype")}} 上で見つけられたプロパティを隠します。

- -

- -

__proto__ の使用

- -
var Circle = function () {};
-var shape = {};
-var circle = new Circle();
-
-// Set the object prototype.
-// 非推奨。 参考用です。 実際のコードで使用しないでください。
-shape.__proto__ = circle;
-
-// オブジェクトのプロトタイプを取得します。
-console.log(shape.__proto__ === circle); // true
-
-var shape = function () {};
-var p = {
-    a: function () {
-        console.log('aaa');
-    }
-};
-shape.prototype.__proto__ = p;
-
-var circle = new shape();
-circle.a(); // aaa
-console.log(shape.prototype === circle.__proto__); // true
-
-// or
-var shape = function () {};
-var p = {
-    a: function () {
-        console.log('a');
-    }
-};
-
-var circle = new shape();
-circle.__proto__ = p;
-circle.a(); // a
-console.log(shape.prototype === circle.__proto__); // false
-
-// or
-function test() {};
-test.prototype.myname = function () {
-    console.log('myname');
-};
-
-var a = new test();
-console.log(a.__proto__ === test.prototype); // true
-a.myname(); // myname
-
-
-// or
-var fn = function () {};
-fn.prototype.myname = function () {
-    console.log('myname');
-};
-
-var obj = {
-    __proto__: fn.prototype
-};
-
-obj.myname(); // myname
-
- -

仕様書

- - - - - - - - - - - - -
仕様書
{{SpecName('ESDraft', '#sec-additional-properties-of-the-object.prototype-object', 'Object.prototype.__proto__')}}
- -

ブラウザーの互換性

- -

{{Compat("javascript.builtins.Object.proto")}}

- -

関連情報

- - diff --git a/files/ja/web/javascript/reference/global_objects/object/proto/index.md b/files/ja/web/javascript/reference/global_objects/object/proto/index.md new file mode 100644 index 0000000000..e7ad3390d9 --- /dev/null +++ b/files/ja/web/javascript/reference/global_objects/object/proto/index.md @@ -0,0 +1,116 @@ +--- +title: Object.prototype.__proto__ +slug: Web/JavaScript/Reference/Global_Objects/Object/proto +tags: + - Deprecated + - ECMAScript 2015 + - JavaScript + - Object + - Property + - Prototype + - Reference +browser-compat: javascript.builtins.Object.proto +translation_of: Web/JavaScript/Reference/Global_Objects/Object/proto +--- +{{JSRef}}{{Deprecated_header}} + +> **Warning:** オブジェクトの `[[Prototype]]` を変更することは、最新の JavaScript エンジンがプロパティアクセスを最適化する仕組み上、***すべての***ブラウザーや JavaScript エンジンにおいて、とても低速な操作となります。プロトタイプの継承関係を変更することによる性能上の影響は微細で広範囲にわたり、単に `obj.__proto__ = ...` という文の実行時間に留まらず、 `[[Prototype]]` が変更された***いずれかの***オブジェクトへのアクセスを持つ***あらゆる***コードに及ぶ可能性があります。性能を気にしている場合、オブジェクトの `[[Prototype]]` の変更は避けるべきです。代わりに、 {{JSxRef("Object.create()")}} を使用して求める `[[Prototype]]` をもつオブジェクトを新たに生成してください。 + +> **Warning:** `Object.prototype.__proto__` は現時点でほとんどのブラウザーが対応していますが、そのプロパティの存在と正確な動作は、ウェブブラウザーの互換性を確保するためのレガシー機能として、 ECMAScript 2015 で初めて標準化されました。より広く対応させるには、代わりに {{JSxRef("Object.getPrototypeOf()")}} を使用してください。 + +`__proto__` は {{JSxRef("Object.prototype")}} のアクセサープロパティ (ゲッター関数およびセッター関数) で、アクセスされるオブジェクトの内部の `[[Prototype]]` (オブジェクトまたは {{JSxRef("Global_Objects/null", "null")}} のどちらか) を暴露します。 + +`__proto__` の使用は、論争の的になり、推奨されていません。もともと ECMAScript 言語仕様には含まれていませんでしたが、現在のブラウザーでは結局それを実装しています。最近になって、 `__proto__` プロパティはウェブブラウザー間の互換性を保つために ECMAScript2015 の仕様で標準化されたので、将来的には対応されることになります。これは非推奨扱いで、代わりに {{JSxRef("Object.getPrototypeOf")}}/{{JSxRef("Reflect.getPrototypeOf")}} および {{JSxRef("Object.setPrototypeOf")}}/{{JSxRef("Reflect.setPrototypeOf")}} を推奨しています (とはいえ、オブジェクトの `[[Prototype]]` の設定は、性能が気になる場合には避けるべき低速の操作ですが)。 + +また、 `__proto__` プロパティは、生成時に `[[Prototype]]` オブジェクトを設定するために {{JSxRef("Object.create()")}} の代わりとしてもオブジェクトリテラルの定義で使用されます。参照: [オブジェクト初期化子 / リテラル構文](/ja/docs/Web/JavaScript/Reference/Operators/Object_initializer) + +## 解説 + +`__proto__` ゲッター関数はオブジェクトの内部の `[[Prototype]]` の値を外部に公開します。オブジェクトリテラルを使用して生成されたオブジェクトでは、この値は {{JSxRef("Object.prototype")}} です。配列リテラルを使用して生成されたオブジェクトでは、この値は {{JSxRef("Array.prototype")}} です。関数では、この値は {{JSxRef("Function.prototype")}} です。 `new fun` を使用して生成されたオブジェクトでは、 `fun` が JavaScript の ({{JSxRef("Array")}}、{{JSxRef("Boolean")}}、{{JSxRef("Date")}}、 {{JSxRef("Number")}}、 {{JSxRef("Object")}}、 {{JSxRef("String")}} などによって提供された内蔵コンストラクター関数のうちの一つである場合は — JavaScript の進化によって追加された新しいコンストラクタを含みます)、この値は常に `fun.prototype` です。 `new fun` を使用して生成されたオブジェクトでは、 `fun` がスクリプトで定義された関数である場合、この値は常に `fun.prototype` の値です。 (すなわち、コンストラクターがほかのオブジェクトを明示的に返さない場合、または `fun.prototype` に再代入されていない場合)。 + +`__proto__` のセッターでオブジェクトの `[[Prototype]]` を変更することができます。オブジェクトは、 {{JSxRef("Object.isExtensible()")}} に応じて拡張可能である必要があります。拡張可能ではない場合、 {{JSxRef("Global_Objects/TypeError", "TypeError")}} が発生します。与えられた値はオブジェクト、または {{JSxRef("Global_Objects/null", "null")}} である必要があります。他の値が与えられた場合は何もしません。 + +プロトタイプが継承のためにどのように使用されるかを理解するには、ガイド記事の[継承とプロトタイプチェーン](/ja/docs/Web/JavaScript/Inheritance_and_the_prototype_chain)を参照してください。 + +`__proto__` プロパティは、ゲッター関数とセッター関数からなる {{JSxRef("Object")}} 上の簡単なアクセサープロパティです。最終的にの {{JSxRef("Object")}} を参照する `__proto__` に対してのプロパティアクセスはこのプロパティを探します。しかし、 {{JSxRef("Object")}} を参照しないアクセスはこのプロパティを探しません。 {{JSxRef("Object")}} が参照される前にいくつかの他の `__proto__` プロパティが見つけられた場合、そのプロパティは、 {{JSxRef("Object")}} 上で見つけられたプロパティを隠します。 + +## 例 + +### \_\_proto\_\_ の使用 + +```js + +function Circle() {} +const shape = {}; +const circle = new Circle(); + +// オブジェクトプロトタイプの設定 +// 非推奨。 参考用です。 実際のコードで使用しないでください。 +shape.__proto__ = circle; + +// オブジェクトプロトタイプの取得 +console.log(shape.__proto__ === Circle); // false + +const ShapeA = function () {}; +const ShapeB = { +  a() { +  console.log('aaa'); +  } +}; +console.log(ShapeA.prototype.__proto__ = ShapeB); + +const shapea = new ShapeA(); +shapea.a(); // aaa +console.log(ShapeA.prototype === shapea.__proto__); // true + +// または +const ShapeC = function () {}; +const ShapeD = { + a() { + console.log('a'); + } +}; + +const shapeC = new ShapeC(); +shapeC.__proto__ = ShapeD; +shapeC.a(); // a +console.log(ShapeC.prototype === shapeC.__proto__); // false + +// または +function Test() {} +Test.prototype.myname = function () { + console.log('myname'); +}; + +const a = new Test(); +console.log(a.__proto__ === Test.prototype); // true +a.myname(); // myname + +// または +const fn = function () {}; +fn.prototype.myname = function () { + console.log('myname'); +}; + +var obj = { + __proto__: fn.prototype +}; + +obj.myname(); // myname + + +``` + +## 仕様書 + +{{Specifications}} + +## ブラウザーの互換性 + +{{Compat}} + +## 関連情報 + +- {{JSxRef("Object.prototype.isPrototypeOf()")}} +- {{JSxRef("Object.getPrototypeOf()")}} +- {{JSxRef("Object.setPrototypeOf()")}} -- cgit v1.2.3-54-g00ecf