意見のプロトタイプとプロトタイプチェーン

-proto-属性インスタンスオブジェクトの属性値のデフォルト値のプロトタイプのコンストラクタ

(ヌル以外)1、タイプ(配列、関数、オブジェクト)へのすべての参照が自由に拡張することができる属性。

図2は、すべての属性(とも呼ばれる暗黙的なプロトタイプは、それが一般的なオブジェクトである)「_ _ _ proto_」参照タイプを持っています。

図3に示すように、すべての機能が「プロトタイプ」プロパティ有する(ターゲットオブジェクトは、デフォルトでは空である)は、対応するプロトタイプオブジェクトを指し、(明示的なプロトタイプと呼ばれ、それはまた、一般的なオブジェクトです)。

図4に示すように、すべての参照型、その「_ _ _ proto_」コンストラクタの属性ポイント「プロトタイプ」属性。

5オブジェクトのプロパティを取得しようとしたときにオブジェクト自体が存在しない場合、このプロパティは、それは探すために「_ _ _ proto_」プロパティ(コンストラクタのすなわち「原型」プロパティ)に行きます。

その後のポイントは、我々はこれらの点は、プロトタイプとプロトタイプチェーンに理解し、終了していました。
プロトタイプ

私たちの最初の外観のプロトタイプの例。

	//这是一个构造函数
	function Foo(name,age){
		this.name=name;
		this.age=age;
	}
	/*根据要点3,所有的函数都有一个prototype属性,这个属性是一个对象
	再根据要点1,所有的对象可以自由扩展属性
	于是就有了以下写法*/
	Foo.prototype={
		// prototype对象里面又有其他的属性
		showName:function(){
			console.log("I'm "+this.name);//this是什么要看执行的时候谁调用了这个函数
		},
		showAge:function(){
			console.log("And I'm "+this.age);//this是什么要看执行的时候谁调用了这个函数
		}
	}
	var fn=new Foo('小明',19)
	/*当试图得到一个对象的属性时,如果这个对象本身不存在这个属性,那么就会去它
	构造函数的'prototype'属性中去找*/
	fn.showName(); //I'm 小明
	fn.showAge(); //And I'm 19

これは、それが十分に理解され、試作品です。では、なぜそれの試作品を使うのか?

我々はこのようにそれを書いた場合、)はFoo(で多数のオブジェクトを作成する場合を想像:

function Foo(name,age){
		this.name=name;
		this.age=age;
		this.showName=function(){
			console.log("I'm "+this.name);
		}
		this.showAge=function(){
			console.log("And I'm "+this.age);
		}
	}

だから我々は、リソースの多くを取るでしょうshowNameとshowAge方法を、持っている各オブジェクトの外に作成されました。
プロトタイプは、内部の(このプロパティは一意である)のみコンストラクタ関数のプロパティの割り当て、及びFoo.prototypeプロパティに書き込む方法を与える必要があることによって達成されます。各オブジェクトはshowName、showAgeメソッド内prototypeプロパティを使用して、多くのリソースを節約することができるように。
プロトタイプチェーン

プロトタイプチェーンをよりよく理解するため、プロトタイプを理解します。

#####次の単語は、プロトタイプチェーンを理解することができ
、オブジェクトのプロパティを取得しようとすると、ポイント5によると、オブジェクト自体この属性が存在しない場合、それはにコンストラクタ「プロトタイプ」プロパティに行きます探しています。そして、それはプロトタイプ'属性がオブジェクトであるので、それはまた、「_ _ _ proto_」プロパティを持つように。

その後、我々は例を見て:

	// 构造函数
	function Foo(name,age){
	 	this.name=name;
	 	this.age=age;
	}
	Object.prototype.toString=function(){
		//this是什么要看执行的时候谁调用了这个函数。
		console.log("I'm "+this.name+" And I'm "+this.age);
	}
	var fn=new Foo('小明',19);
	fn.toString(); //I'm 小明 And I'm 19
	console.log(fn.toString===Foo.prototype.__proto__.toString); //true
	
	console.log(fn.__proto__ ===Foo.prototype)//true
	console.log(Foo.prototype.__proto__===Object.prototype)//true
	console.log(Object.prototype.__proto__===null)//true

それは不思議ではないですか?さんは分析してみましょう。
絵の説明がここに書く
まず、fnのコンストラクタはFooのです()。従って:
fn._プロト_ _ === Foo.prototype
とFoo.prototypeが通常のオブジェクトであるため、そのコンストラクタは、加工対象物である:
。Foo.prototype
_ _ _ ===プロトのObject.prototype
上記によってコードは、我々はそれが日付のヌルまで、層ごとに上がるだろう、オブジェクト自体が存在しない場合、このメソッドが呼び出され、こののtoString()メソッドは内部のObject.prototypeである知っています。

それにFoo.prototypeを見つける、またはこのメソッドが見つからない、[オブジェクトを呼び出し、その後、のObject.prototypeを探し探しに行きました、といったので、そうするときFNコールのtoString()、JS fnが、このアプローチを見つけることができませんでしたtoString()メソッドで.prototype。

これは、のObject.prototypeのメソッドを呼び出すための機構のプロトタイプチェーンの存在の正確fnのプロトタイプチェーンです。

おすすめ

転載: blog.csdn.net/weixin_42322521/article/details/92392988