プロトタイプ、プロトタイプ、および新しい演算子

この記事では、__ proto__、プロトタイプのプロパティ、およびJavaScriptでのnew演算子の操作について、例を挙げて簡単に説明します。

__Proto__プロパティ


JavaScriptのすべてのオブジェクトには__proto__プロパティがあります。 これは隠しシステムプロパティであり、すべての言語の実装でユーザーが使用できるわけではありません。
オブジェクトのプロパティにアクセスする場合、まずオブジェクト自体で検索されます:
var obj = {ownProperty: 1}; console.log(obj.ownProperty);// 1 
ただし、存在しない場合は、__ proto__プロパティで検索が行われます。
 obj.__proto__ = {propertyOfProto: 2}; console.log(obj.propertyOfProto);// 2 
存在しない場合は、チェーンのさらに下で検索されます。
 obj.__proto__.__proto__ = {propertyOfProtosProto: 3}; console.log(obj.propertyOfProtosProto);// 3 
このチェーンは、プロトタイプチェーンと呼ばれます。



任意の値の__proto__(nullおよび未定義を除く)は、対応するデータ型のプロトタイプを参照します。
 (0).__proto__ === Number.prototype && false.__proto__ === Boolean.prototype && "string".__proto__ === String.prototype && (new Date).__proto__ === Date.prototype && (function(){}/* new Function */).__proto__ === Function.prototype 
すべてのデータ型はObjectを継承します。たとえば、
 Number.prototype.__proto__ === Object.prototype 
そして最後に、チェーンの終わり:
 Object.prototype.__proto__ === null 

プロトタイププロパティ


しかし、プロトタイプのプロパティは何ですか? これは共通のプロパティであり、他のプロパティと違いはありません。 2つの機能を除く:

1)JavaScriptの関数にはprototypeプロパティがあります。 デフォルトでは、関数自体を参照する単一のコンストラクタープロパティを持つオブジェクトです。



2)プロトタイププロパティは、new演算子で新しいオブジェクトを作成するときに使用されます。

新しい演算子


このステートメントは次のことを行います。

1)空のオブジェクトを作成します:
 var instance = {}; 

2)クラス関数のプロトタイプを参照して、__ proto__をこのオブジェクトに設定します。
 instance.__proto__ = FnClass.prototype; 

3)クラス関数を新しく作成されたオブジェクトに適用します:
 constructorReturns = FnClass.apply(instance, arguments); 
(つまり、FnClass関数を実行し、thisとしてインスタンスを渡し、arguments配列としてargumentsを渡します)

4)クラス関数のインスタンスを返しますが、FnClassがオブジェクトを返した場合、次のようになります。
 return constructorReturns instanceof Object ? constructorReturns : instance; 

クラス関数を、new演算子が後で適用されると予想される関数と呼びます。 このような関数は通常大文字で表記されます。

スクリプトで__proto__を使用する


なぜなら __proto__プロパティは非表示であり、言語仕様に記載されていないため、明示的な使用は正しくありません。 したがって、上記の例のように記述しないでください:)このコードはコンソール専用です。
ただし、最新の(現在の)ECMA Script 5仕様には、__ proto__プロパティ、Object.createおよびObject.getPrototypeOfを操作できる2つのメソッドがついに登場しました。
2つの簡単な例で彼らの仕事を説明します。

 //var myObj = {__proto__: {property1_OfProto: 1}} var myObj = Object.create({property1_OfProto: 1}); 

 //myObj.__proto__.property2_OfProto = 2 Object.getPrototypeOf(myObj).property2_OfProto = 2; 

JavaScriptの以前のバージョンを使用している場合、Object.createメソッドを自分で作成できます。
 if(!Object.create){ Object.create = function(proto){ var Fn = function(){}; Fn.prototype = proto; return new Fn; } } 

getPrototypeOfを使用すると、状況はより複雑になり、関数に対してのみエミュレートできます。この関数のコンストラクターが変更されていない場合のみです。
 if(!Object.getPrototypeOf){ if( (new Object).__proto__ !== Object.prototype ){ // may return incorrect value if fn.prototype has been modified Function.getPrototypeOf = function(fn){ if(typeof(fn)!=='function') throw new TypeError('Function.getPrototypeOf called on non-function'); return fn.constructor.prototype; } }else{ Object.getPrototypeOf = function(obj){ return obj.__proto__; } } } 

そして、コメントでアドバイスされているように、 github.com / kriskowal / es5-shimライブラリを使用するのが良い

次に、JavaScriptのクラスについて...

Source: https://habr.com/ru/post/J140810/


All Articles