JSプロトタイプとプロトタイプチェーン
4523 ワード
一.一般的なオブジェクトと関数オブジェクト
JavaScriptの中で、万物はすべて対象です.しかし、相手にも違いがあります.一般的なオブジェクトと関数オブジェクトに分けられ、Object、FunctionはJSの関数オブジェクトです.次に例をあげて説明します
function f 1(){}var f 2=function(){}var f 3=new Function('str'、'consolie.log')var o 3=new f 1()var o 1={}var o 2=new Object();consolie.log(typeof Object)//function consolone.logn(typeof Function)//function consolone.log(typeof o 1)//object consolie.log(typeof o 2)//object consolie.log(typeof o 3)//object consolie.log(typeof f 1)//function consolone.log(typeof f 2)//function consolone.log(typeof f 3)//機能
上記の例ではo 1 o 2 o 3は一般的なオブジェクトであり、f 1 f 2 f 3は関数オブジェクトである.どのように区別しますか?実は簡単です.new Functionによって作成されたオブジェクトはすべて関数オブジェクトで、他のオブジェクトはすべて普通のオブジェクトです.f 1,f 2は、結局はnew Function()で作成されます.Function ObjectもNew Functionで作成されます.
二.原型の対象
JavaScriptでは、オブジェクト(関数)を定義するたびに、オブジェクトの中に予め定義されている属性が含まれます.この関数オブジェクトの属性の一つがプロトタイプです.注:一般対象にはプロトタイプはありませんが、プロト属性があります.
プロトタイプのオブジェクトは、通常のオブジェクトです.関数オブジェクトですが、プロトタイプの属性はありません.次の例を見てください.
function f 1(){}Object consolip.logt/logt(f 1.prototype)//Object consolive.logt(type of Funct.prototype)/Function、この特別なconsolip.logt/Object/Object/Object
このconsolie.log(f 1.prototype)/f 1{}の出力から、f 1.prototypeはf 1の例示的なオブジェクトであることがわかる.f 1を作成するときに、そのインスタンスオブジェクトを作成し、そのプロトタイプに値を付けます.基本的なプロセスは以下の通りです.
var temp=new f 1()f 1.prototype=temp;
したがって、Funtion.prototypeはなぜ関数オブジェクトなのか、上述のようにnew Function()によって生成されるオブジェクトはすべて関数オブジェクトであるため、temp 1は関数オブジェクトである.
var temp 1=new Function()Function.prototype=temp 1;
その原型の対象は何に使いますか?主な役割は継承のためです.例を挙げました
三.プロトタイプチェーン
JSはオブジェクトを作成する際に、プロトという内蔵属性があります.作成した関数オブジェクトのプロトタイプを指します.上記の例を例にとって:
consolie.log(zjh.proto==person.prototype)/true
同様に、person.prototypeオブジェクトにもproto属性があり、それはその関数オブジェクト(Object)を作成するprototypeを指す.
consolie.log(person.prototype.proto==Object.prototype)/true
引き続き、Object.prototypeの対象もproto属性がありますが、それは特殊で、nullです.
consolie.log(Object.prototype.proto)//null
私たちはこのプロトが連結されているObject.prototype.protoをnullとするチェーンをプロトタイプチェーンといいます.次の図のように
四.メモリ構造図
より深く、直感的に理解するために、上のメモリ構造図を描きます.
絵の約束:
疑問点の解釈:
1.Object.
proto==Function.prototype//true
Objectは関数オブジェクトで、new Funct()によって作成されますので、Object.
protoはFuntions.prototypeを指します.
2.Function.
proto==Function.prototype//true
Functionも対象関数であり、new Function()によって作成されるので、Functionです.
protoはFuntions.prototypeを指します.
自分は自分で創ったので、論理に合わないようですが、よく考えてみると、現実世界も似ています.お母さんはどうやって生まれましたか?おばあさんは生まれましたか?類人猿は進化してきました.あの類人猿はどこから来ましたか?.
3.Function.prototype.
proto==Object.prototype//true
この点については、ちょっと戸惑いもありますが、説明してみてもいいです.
Function.prototypeは関数対象で、理論的には彼の
プロトはFuntions.prototypeを指すべきです.彼自身が自分を指す意味がないです.JSはいつも万物の全ての対象を強調しています.関数の対象も対象です.彼に祖先を認めて、Object.prototypeを指します.Object.prototype.
プロト==nullは、プロトタイプチェーンが正常に終了することを保証します.
五.constructor
プロトタイプのオブジェクトには事前に定義されたconstructor属性があり、その関数オブジェクトを参照します.これはサイクル参照person.prototype.com nstructor==person/true Function.prototype.com nstructor==Function/true Object.prototype.prototytructor==Object/true完璧な下の上のメモリ構造図です.
二つの注意点があります.
(1)Object.com nstructor==Funct;//true
自分のObjectはFunction関数で作られています.
(2)どのようにオブジェクトのconstructorを検索しますか?そのオブジェクトのプロトタイプチェーン上で最初のconstructor属性が指しているオブジェクトを探しています.
六.まとめ
1.プロトタイプとプロトタイプチェーンはJSが継承を実現するモデルです.2.プロトタイプチェーンの形成は本当にプロトによるもので、プロトタイプではなく、この言葉を深く理解するために、私達はまた例を挙げて、前を見てみます.本当に理解しましたか?
var animal=function(){}var dog=function(){}アニマル.price=2000;//dog.prototype=animal;var tidy=new dog();consolie.logs(dog.price)/undefined consoline.logs(tidy.price)/2000
なぜですか?メモリを描く:
これはどんな問題を説明しますか?dog.priceを実行する時、priceのこの属性がないことを発見して、prototypeの指すanimalはこの属性がありますが、しかしそれはべつにこの“鎖”に沿って探しに行きません.同じように、tidy.priceを実行する時も、この属性はありません.
protoはアニマルを指していますが、このチェーンに沿って探しています.アニマルにはprice属性がありますので、tidy.price出力2000.これにより、プロトタイプチェーンの本当の形成は
prototypeではなくプロロ.したがって、このようにdogを指定すると.
proto=animal.そのdog.price=2000.
最後に比喩をします.正確ではないですが、原型の理解に役に立つかもしれません.
父(関数対象)さんは長男(prototype)、つまりお兄さんです.お父さんはお兄さんにたくさんのおもちゃを買ってあげました.あなたが生まれた時、あなたたちの間の絆.
proto)お兄さんのおもちゃを自然に持ってくれます.同じように、あなたも長男で、また彼にたくさんのおもちゃを買ってあげました.息子が生まれた時、あなたの子供はあなたの長男のおもちゃを全部持っています.彼らがけんかするかどうかについては、これは私たちのことではない.
ですから、あなたはあなたの兄から受け継いだのです.「長兄は父の如し」という言葉を証明しました.
JavaScriptの中で、万物はすべて対象です.しかし、相手にも違いがあります.一般的なオブジェクトと関数オブジェクトに分けられ、Object、FunctionはJSの関数オブジェクトです.次に例をあげて説明します
function f 1(){}var f 2=function(){}var f 3=new Function('str'、'consolie.log')var o 3=new f 1()var o 1={}var o 2=new Object();consolie.log(typeof Object)//function consolone.logn(typeof Function)//function consolone.log(typeof o 1)//object consolie.log(typeof o 2)//object consolie.log(typeof o 3)//object consolie.log(typeof f 1)//function consolone.log(typeof f 2)//function consolone.log(typeof f 3)//機能
上記の例ではo 1 o 2 o 3は一般的なオブジェクトであり、f 1 f 2 f 3は関数オブジェクトである.どのように区別しますか?実は簡単です.new Functionによって作成されたオブジェクトはすべて関数オブジェクトで、他のオブジェクトはすべて普通のオブジェクトです.f 1,f 2は、結局はnew Function()で作成されます.Function ObjectもNew Functionで作成されます.
二.原型の対象
JavaScriptでは、オブジェクト(関数)を定義するたびに、オブジェクトの中に予め定義されている属性が含まれます.この関数オブジェクトの属性の一つがプロトタイプです.注:一般対象にはプロトタイプはありませんが、プロト属性があります.
プロトタイプのオブジェクトは、通常のオブジェクトです.関数オブジェクトですが、プロトタイプの属性はありません.次の例を見てください.
function f 1(){}Object consolip.logt/logt(f 1.prototype)//Object consolive.logt(type of Funct.prototype)/Function、この特別なconsolip.logt/Object/Object/Object
このconsolie.log(f 1.prototype)/f 1{}の出力から、f 1.prototypeはf 1の例示的なオブジェクトであることがわかる.f 1を作成するときに、そのインスタンスオブジェクトを作成し、そのプロトタイプに値を付けます.基本的なプロセスは以下の通りです.
var temp=new f 1()f 1.prototype=temp;
したがって、Funtion.prototypeはなぜ関数オブジェクトなのか、上述のようにnew Function()によって生成されるオブジェクトはすべて関数オブジェクトであるため、temp 1は関数オブジェクトである.
var temp 1=new Function()Function.prototype=temp 1;
その原型の対象は何に使いますか?主な役割は継承のためです.例を挙げました
var person = function(name){ this.name = name }; person.prototype.getName = function(){ return this.name; } var zjh = new person(‘zhangjiahao’); zjh.getName(); //zhangjiahao
この例から、person.prototypeに関数オブジェクトの属性を設定することによって、personの例(例:zjh)から出た一般的なオブジェクトがこの属性を継承していることが分かる.具体的にどのように継承されているかは、次のプロトタイプチェーンに言及します.三.プロトタイプチェーン
JSはオブジェクトを作成する際に、プロトという内蔵属性があります.作成した関数オブジェクトのプロトタイプを指します.上記の例を例にとって:
consolie.log(zjh.proto==person.prototype)/true
同様に、person.prototypeオブジェクトにもproto属性があり、それはその関数オブジェクト(Object)を作成するprototypeを指す.
consolie.log(person.prototype.proto==Object.prototype)/true
引き続き、Object.prototypeの対象もproto属性がありますが、それは特殊で、nullです.
consolie.log(Object.prototype.proto)//null
私たちはこのプロトが連結されているObject.prototype.protoをnullとするチェーンをプロトタイプチェーンといいます.次の図のように
四.メモリ構造図
より深く、直感的に理解するために、上のメモリ構造図を描きます.
絵の約束:
疑問点の解釈:
1.Object.
proto==Function.prototype//true
Objectは関数オブジェクトで、new Funct()によって作成されますので、Object.
protoはFuntions.prototypeを指します.
2.Function.
proto==Function.prototype//true
Functionも対象関数であり、new Function()によって作成されるので、Functionです.
protoはFuntions.prototypeを指します.
自分は自分で創ったので、論理に合わないようですが、よく考えてみると、現実世界も似ています.お母さんはどうやって生まれましたか?おばあさんは生まれましたか?類人猿は進化してきました.あの類人猿はどこから来ましたか?.
3.Function.prototype.
proto==Object.prototype//true
この点については、ちょっと戸惑いもありますが、説明してみてもいいです.
Function.prototypeは関数対象で、理論的には彼の
プロトはFuntions.prototypeを指すべきです.彼自身が自分を指す意味がないです.JSはいつも万物の全ての対象を強調しています.関数の対象も対象です.彼に祖先を認めて、Object.prototypeを指します.Object.prototype.
プロト==nullは、プロトタイプチェーンが正常に終了することを保証します.
五.constructor
プロトタイプのオブジェクトには事前に定義されたconstructor属性があり、その関数オブジェクトを参照します.これはサイクル参照person.prototype.com nstructor==person/true Function.prototype.com nstructor==Function/true Object.prototype.prototytructor==Object/true完璧な下の上のメモリ構造図です.
二つの注意点があります.
(1)Object.com nstructor==Funct;//true
自分のObjectはFunction関数で作られています.
(2)どのようにオブジェクトのconstructorを検索しますか?そのオブジェクトのプロトタイプチェーン上で最初のconstructor属性が指しているオブジェクトを探しています.
六.まとめ
1.プロトタイプとプロトタイプチェーンはJSが継承を実現するモデルです.2.プロトタイプチェーンの形成は本当にプロトによるもので、プロトタイプではなく、この言葉を深く理解するために、私達はまた例を挙げて、前を見てみます.本当に理解しましたか?
var animal=function(){}var dog=function(){}アニマル.price=2000;//dog.prototype=animal;var tidy=new dog();consolie.logs(dog.price)/undefined consoline.logs(tidy.price)/2000
なぜですか?メモリを描く:
これはどんな問題を説明しますか?dog.priceを実行する時、priceのこの属性がないことを発見して、prototypeの指すanimalはこの属性がありますが、しかしそれはべつにこの“鎖”に沿って探しに行きません.同じように、tidy.priceを実行する時も、この属性はありません.
protoはアニマルを指していますが、このチェーンに沿って探しています.アニマルにはprice属性がありますので、tidy.price出力2000.これにより、プロトタイプチェーンの本当の形成は
prototypeではなくプロロ.したがって、このようにdogを指定すると.
proto=animal.そのdog.price=2000.
最後に比喩をします.正確ではないですが、原型の理解に役に立つかもしれません.
父(関数対象)さんは長男(prototype)、つまりお兄さんです.お父さんはお兄さんにたくさんのおもちゃを買ってあげました.あなたが生まれた時、あなたたちの間の絆.
proto)お兄さんのおもちゃを自然に持ってくれます.同じように、あなたも長男で、また彼にたくさんのおもちゃを買ってあげました.息子が生まれた時、あなたの子供はあなたの長男のおもちゃを全部持っています.彼らがけんかするかどうかについては、これは私たちのことではない.
ですから、あなたはあなたの兄から受け継いだのです.「長兄は父の如し」という言葉を証明しました.