原型オブジェクト
3452 ワード
原型オブジェクト
ここではプロトタイプチェーンを紹介しません.
javascriptの中に「prototype」/「proto」と似ている属性/関数がいくつかあります.ここで簡単にまとめてみます.彼らは何ですか?どれが原型の対象ですか?どちらが違いますか?
[Prototype]
このオブジェクトの内蔵スロットは、プログラマには見えない(直接操作できない).[Prototype]は、javasciptオブジェクトの原型オブジェクトを記録しています.
ECMA 262については以下のように紹介しています.
All ordinary object s have an internal slaot caled[Prottype].The value of this internal sloot is ether
[[Get ProttotypeOf]]
これは対象の内蔵スロットであり、プログラマが直接操作できない.オブジェクトの「Prottype」スロットを取得する方法です.
ECMA 262では、Proxyタイプのオブジェクトを除いて、他のオブジェクトの[Get ProttotypeOf]が直接[Prottype]の値に戻ります.
これは、
getterとして使用する場合、
ECMA 262によれば、この属性はブラウザのみで提供されます.足りないnodeもこの属性を提供しました.
構造関数にはこの属性があります.ECMA 262におけるその紹介は以下の通りである.
Function instancs that can be used as a constructor have a
This property has the atributes{[[Writable]]]:true、[[Enumerable]]]:false、[[Configurble]]:false.
一般的には、構造関数(
Instance OfOperator(V、target):
The abstract operation Instancoff perator(
V
target)implements the generanic algorithm for determining if ECMAScript value
V is an instance of object
targt eigther by consulting
target's@hasinstance method or、if absent、determining whether the value of
タージ
V's prototype chain.
一般的に
ここではプロトタイプチェーンを紹介しません.
javascriptの中に「prototype」/「proto」と似ている属性/関数がいくつかあります.ここで簡単にまとめてみます.彼らは何ですか?どれが原型の対象ですか?どちらが違いますか?
[Prototype]
このオブジェクトの内蔵スロットは、プログラマには見えない(直接操作できない).[Prototype]は、javasciptオブジェクトの原型オブジェクトを記録しています.
ECMA 262については以下のように紹介しています.
All ordinary object s have an internal slaot caled[Prottype].The value of this internal sloot is ether
null
or an object and is used for implement inhers.Data properties of the[Prottype]object art inhersited(and visible as properties of the child object)for the purposes of geaccess,but for access.[[Get ProttotypeOf]]
これは対象の内蔵スロットであり、プログラマが直接操作できない.オブジェクトの「Prottype」スロットを取得する方法です.
ECMA 262では、Proxyタイプのオブジェクトを除いて、他のオブジェクトの[Get ProttotypeOf]が直接[Prottype]の値に戻ります.
Object.getPrototypeOf(O)
Objectオブジェクトのget ProttypeOfメソッドです.これはプログラマが呼び出すことができるものです.O
が対象の場合、O.
[Get ProttypeOf]()
に戻る.これは、
O
のプロトタイプオブジェクトを取得するためにプログラマが使用できる方法である.Object.prototype.__proto__
obj.__proto__
は、javascriptでよく使われるプロトタイプオブジェクトを取得する方法でもある.これは実際にgetter/setterです.getterとして使用する場合、
obj.__proto__
はobj.
[Get ProttypeOf]()
、すなわち、Objの原型オブジェクトを取得することができる.Object.getPrototypeOf(obj)
の結果と一致した.ECMA 262によれば、この属性はブラウザのみで提供されます.足りないnodeもこの属性を提供しました.
Object.prototype
上に定義されているので、Object.prototype
がobj
のプロトタイプチェーン上にあるときにのみ、この属性が使用されることができる.Object.prototype
がプロトタイプチェーン上にいない場合(例えばObject.create(null)
によって生成されたオブジェクト)、この属性は使用できません.Object.getPrototypeOf(O)
であれば、この限りではない.prototype
これはプロトタイプのように見える属性ですが、対象のプロトタイプのオブジェクトではありません.すなわち、obj.prototype
はobj
のプロトタイプオブジェクトではない.構造関数にはこの属性があります.ECMA 262におけるその紹介は以下の通りである.
Function instancs that can be used as a constructor have a
prototype
property.Whenever such a Function instance is created another ordinary object is also created and is the initial value of the function'sprototype
property.Uless otherswise specified,the value of theprototype
property is used to initialize the[Prottype]internal slot of the object created when that function is invoked as a construct.This property has the atributes{[[Writable]]]:true、[[Enumerable]]]:false、[[Configurble]]:false.
一般的には、構造関数(
F
)を使用して新しいオブジェクト(obj
)を作成すると、構造関数のprototype
属性(F.prototype
)が、新しいオブジェクトの原型オブジェクト(obj.
[Prottype])となる.F.prototype
はF
の原型オブジェクトではない.F.prototype
は、通常、new F(...)
のプロトタイプオブジェクトである.instanceof
obj instanceof F
は、obj
がF
の例であるかどうかを確認する.F
がobj
のプロトタイプチェーン上にあるかどうかを確認するのではない.この検査は、F
が構造関数であることを要求し、F.prototype
がobj
のプロトタイプチェーン上にあるかどうかを確認する.Instance OfOperator(V、target):
The abstract operation Instancoff perator(
V
target)implements the generanic algorithm for determining if ECMAScript value
V is an instance of object
targt eigther by consulting
target's@hasinstance method or、if absent、determining whether the value of
タージ
prototype
property is present inV's prototype chain.
一般的に
obj
というのはF
タイプのオブジェクトであり、F.prototype
がobj
のプロトタイプチェーン上にあることを指す.