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 --- .../global_objects/object/proto/index.html | 129 --------------------- .../reference/global_objects/object/proto/index.md | 116 ++++++++++++++++++ 2 files changed, 116 insertions(+), 129 deletions(-) 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/javascript/reference/global_objects/object/proto') 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