diff options
author | Masahiro FUJIMOTO <mfujimot@gmail.com> | 2021-08-09 13:01:42 +0900 |
---|---|---|
committer | GitHub <noreply@github.com> | 2021-08-09 13:01:42 +0900 |
commit | bba1788dd593e5f64bfb6814cb550259638619a0 (patch) | |
tree | d0e230209695e3bcf77e1783e6085308578bf103 /files/ja/web/javascript/reference/global_objects/object/proto | |
parent | b33bd88353d4e3a23a9fd60fa6cef8b656b79dbc (diff) | |
download | translated-content-bba1788dd593e5f64bfb6814cb550259638619a0.tar.gz translated-content-bba1788dd593e5f64bfb6814cb550259638619a0.tar.bz2 translated-content-bba1788dd593e5f64bfb6814cb550259638619a0.zip |
Web/JavaScript/Reference/Global_Objects/Object 以下の一部を Markdown に変換 (#1691)
以下のページを 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
Diffstat (limited to 'files/ja/web/javascript/reference/global_objects/object/proto')
-rw-r--r-- | files/ja/web/javascript/reference/global_objects/object/proto/index.html | 129 | ||||
-rw-r--r-- | files/ja/web/javascript/reference/global_objects/object/proto/index.md | 116 |
2 files changed, 116 insertions, 129 deletions
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 ---- -<div>{{JSRef}}{{Deprecated_header}} -<div class="blockIndicator warning"> -<p><strong>警告:</strong> オブジェクトの <code>[[Prototype]]</code> を変更することは、最新の JavaScript エンジンがプロパティアクセスを最適化する仕組み上、<strong><em>すべての</em></strong>ブラウザーや JavaScript エンジンにおいて、とても低速な操作となります。プロトタイプの継承関係を変更することによる性能上の影響は微細で広範囲にわたり、単に <code>obj.__proto__ = ...</code> という文の実行時間に留まらず、 <code>[[Prototype]]</code> が変更された<strong><em>いずれかの</em></strong>オブジェクトへのアクセスを持つ<strong><em>あらゆる</em></strong>コードに及ぶ可能性があります。性能を気にしている場合、オブジェクトの <code>[[Prototype]]</code> の変更は避けるべきです。代わりに、 {{JSxRef("Object.create()")}} を使用して意図する <code>[[Prototype]]</code> をもつオブジェクトを新たに生成してください。</p> -</div> - -<div class="blockIndicator warning"> -<p><strong>警告:</strong> <code>Object.prototype.__proto__</code> は現時点でほとんどのブラウザーが対応していますが、そのプロパティの存在と正確な動作は、ウェブブラウザーの互換性を確保するためのレガシー機能として、 ECMAScript 2015 で初めて標準化されました。代わりに {{JSxRef("Object.getPrototypeOf()")}} を使用してください。</p> -</div> -</div> - -<p>{{JSxRef("Object.prototype")}} の <code>__proto__</code> プロパティは、アクセスされるオブジェクトの内部の <code>[[Prototype]]</code> (オブジェクトまたは {{JSxRef("Global_Objects/null", "null")}} のどちらか) を暴露するアクセサプロパティ (ゲッター関数とセッター関数) です。</p> - -<p><code>__proto__</code> の使用は、論争の的になり、推奨されていません。もともと ECMAScript 言語仕様には含まれていませんでしたが、現在のブラウザーでは結局それを実装しています。最近になって、 <code>__proto__</code> プロパティはウェブブラウザー間の互換性を保つために ECMAScript2015 の仕様で標準化されたので、将来的には対応されることになります。これは非推奨扱いで、代わりに {{JSxRef("Object.getPrototypeOf")}}/{{JSxRef("Reflect.getPrototypeOf")}} および {{JSxRef("Object.setPrototypeOf")}}/{{JSxRef("Reflect.setPrototypeOf")}} を推奨しています (とはいえ、オブジェクトの <code>[[Prototype]]</code> の設定は、性能が気になる場合には避けるべき低速の操作ですが)。</p> - -<p>また、<code>__proto__</code> プロパティは、生成時に <code>[[Prototype]]</code> オブジェクトを設定するために {{JSxRef("Object.create()")}} の代わりとしてもオブジェクトリテラルの定義で使用されます。参照: <a href="/docs/Web/JavaScript/Reference/Operators/Object_initializer">オブジェクト初期化子</a></p> - -<h2 id="Description" name="Description">解説</h2> - -<p><code>__proto__</code> ゲッター関数はオブジェクトの内部の <code>[[Prototype]]</code> の値を外部に公開します。オブジェクトリテラルを使用して生成されたオブジェクトでは、この値は {{JSxRef("Object.prototype")}} です。配列リテラルを使用して生成されたオブジェクトでは、この値は {{JSxRef("Array.prototype")}} です。関数では、この値は {{JSxRef("Function.prototype")}} です。 <code>new fun</code> を使用して生成されたオブジェクトでは、 <code>fun</code> が JavaScript の ({{JSxRef("Array")}}、{{JSxRef("Boolean")}}、{{JSxRef("Date")}}、 {{JSxRef("Number")}}、 {{JSxRef("Object")}}、 {{JSxRef("String")}} などによって提供された内蔵コンストラクター関数のうちの一つである場合は — JavaScript の進化によって追加された新しいコンストラクタを含みます)、この値は常に <code>fun.prototype</code> です。 <code>new fun</code> を使用して生成されたオブジェクトでは、 <code>fun</code> がスクリプトで定義された関数である場合、この値は常に <code>fun.prototype</code> の値です。 (すなわち、コンストラクターがほかのオブジェクトを明示的に返さない場合、または <code>fun.prototype</code> に再代入されていない場合)。</p> - -<p><code>__proto__</code> のセッターでオブジェクトの <code>[[Prototype]]</code> を変更することができます。オブジェクトは、 {{JSxRef("Object.isExtensible()")}} に応じて拡張可能である必要があります。拡張可能ではない場合、 {{JSxRef("Global_Objects/TypeError", "TypeError")}} が発生します。与えられた値はオブジェクト、または {{JSxRef("Global_Objects/null", "null")}} である必要があります。他の値が与えられた場合は何もしません。</p> - -<p>プロトタイプが継承のためにどのように使用されるかを理解するには、ガイド記事の<a href="/ja/docs/Web/JavaScript/Guide/Inheritance_and_the_prototype_chain">継承とプロトタイプチェーン</a>を参照してください。</p> - -<p><code>__proto__</code> プロパティは、ゲッター関数とセッター関数からなる {{JSxRef("Object.prototype")}} 上の簡単なアクセサープロパティです。最終的にの {{JSxRef("Object.prototype")}} を参照する <code>__proto__</code> に対してのプロパティアクセスはこのプロパティを探します。しかし、 {{JSxRef("Object.prototype")}} を参照しないアクセスはこのプロパティを探しません。 {{JSxRef("Object.prototype")}} が参照される前にいくつかの他の <code>__proto__</code> プロパティが見つけられた場合、そのプロパティは、 {{JSxRef("Object.prototype")}} 上で見つけられたプロパティを隠します。</p> - -<h2 id="Examples" name="Examples">例</h2> - -<h3 id="Using___proto__" name="Using___proto__">__proto__ の使用</h3> - -<pre class="brush: js notranslate">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 -</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-additional-properties-of-the-object.prototype-object', 'Object.prototype.__proto__')}}</td> - </tr> - </tbody> -</table> - -<h2 id="Browser_compatibility" name="Browser_compatibility">ブラウザーの互換性</h2> - -<p>{{Compat("javascript.builtins.Object.proto")}}</p> - -<h2 id="See_also" name="See_also">関連情報</h2> - -<ul> - <li>{{JSxRef("Object.prototype.isPrototypeOf()")}}</li> - <li>{{JSxRef("Object.getPrototypeOf()")}}</li> - <li>{{JSxRef("Object.setPrototypeOf()")}}</li> -</ul> 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()")}} |