プロトタイプチェーンの詳細解

4899 ワード

一.普通の対象と関数の対象はJavaScriptの中で、万物はすべて対象です.しかし、相手にも違いがあります.一般的なオブジェクトと関数オブジェクトに分けられ、Object、FunctはJSの関数オブジェクトです.次に例をあげて説明します
var o1 = {}; 
var o2 =new Object();
var o3 = new f1();
function f1(){}; 
var f2 = function(){};
var f3 = new Function('str','console.log(str)');
console.log(typeof Object); //function 
console.log(typeof Function); //function  
console.log(typeof f1); //function 
console.log(typeof f2); //function 
console.log(typeof f3); //function   
console.log(typeof o1); //object 
console.log(typeof o2); //object 
console.log(typeof o3); //object
上記の例ではo 1 o 2 o 3は一般的なオブジェクトであり、f 1 f 2 f 3は関数オブジェクトである.どのように区別しますか?実は簡単です.new Functionによって作成されたオブジェクトはすべて関数オブジェクトで、他のオブジェクトはすべて普通のオブジェクトです.f 1,f 2は、結局はnew Function()で作成されます.Function ObjectもNew Functionで作成されます.
普通のオブジェクトと関数のオブジェクトをはっきり区別しなければなりません.以下はよく使います.
二.構造関数について、まず構造関数の知識を復習します.
function Person(name, age, job) {
	 this.name = name;
	 this.age = age;
	 this.job = job;
	 this.sayName = function() { alert(this.name) } 
}
var person1 = new Person('Zaxlct', 28, 'Software Engineer');
var person2 = new Person('Mick', 23, 'Doctor');
上記の例では、person 1とperson 2はいずれもPersonの例である.これらの例はいずれもPersonを指すconstructor属性を持っている.すなわち、
  console.log(person1.constructor == Person); //true
  console.log(person2.constructor == Person); //true
私たちは二つの概念(コンストラクション、例)を覚えます.person 1とperson 2はいずれもコンストラクションPersonの実例となる公式です.例のコンストラクター属性はコンストラクタを指します.
三.プロトタイプのオブジェクトはJavaScriptで、一つのオブジェクト(関数も対象)を定義するたびに、オブジェクトの中に予め定義されている属性がいくつか含まれます.各関数オブジェクトにはプロトタイプ属性があり、この属性は関数のプロトタイプオブジェクトを指します.(とりあえずプロト第二節の授業を使って詳しく分析します.)
function Person() {}
	Person.prototype.name = 'Zaxlct';
	Person.prototype.age  = 28;
	Person.prototype.job  = 'Software Engineer';
	Person.prototype.sayName = function() {
	alert(this.name);
}  
var person1 = new Person();
person1.sayName(); // 'Zaxlct'
var person2 = new Person();
person2.sayName(); // 'Zaxlct'
console.log(person1.sayName == person2.sayName); //true
私たちは本論文の最初の「法則」を得ました.各オブジェクトにプロト属性がありますが、関数オブジェクトだけプロトタイプ属性があるというのは何ですか?上の例を改めたら分かります.
Person.prototype = {
   name:  'Zaxlct',
   age: 28,
   job: 'Software Engineer',
   sayName: function() {
     alert(this.name);
   }
}
原型の対象は名前の通り普通の対象です.今から原型の対象がPerson.prototypeであることをしっかり覚えてください.もしあなたがまだそれを恐れるなら、それをアルファベットA:var A=Person.prototypeにしてください.
上で私達はAに4つの属性を追加しました.name、age、job、sayName.実はもう一つのデフォルトの属性があります.
デフォルトでは、すべてのプロトタイプのオブジェクトが自動的にconstructor属性を取得します.この属性はプロトタイプの属性を指す関数です.
上記の言葉はちょっと言いにくいですが、私達は「翻訳」してみます.Aはデフォルトのconstructor属性を持っています.この属性はポインタで、Personを指しています.Person.prototype.com nstructor==Person
上の第二小節の「コンストラクター」では、実例のコンストラクタ属性がコンストラクターを指すことを知っています.
この二つの「公式」はちょっと連絡があるようです.
person 1.com nstructor==Person Person.prototype.com nstructor==Person person 1はなぜconstrutor属性がありますか?それはperson 1がPersonの実例だからです.Person.prototypeはなぜconstructor属性がありますか?同じように、Person.prototypeもPersonの例です.つまりPersonが作成されたときに、そのインスタンスオブジェクトを作成し、そのプロトタイプに値を付けます.基本的なプロセスは以下の通りです.Person.prototype=A結論:プロトタイプオブジェクト(Person.prototype)は構成関数(Person)の一例である.
プロトタイプのオブジェクトは通常のオブジェクトです.関数オブジェクトですが、プロトタイプ属性はありません.次の例を見てください.
 function Person(){};
 console.log(Person.prototype) //Person{}
 console.log(typeof Person.prototype) //Object
 console.log(typeof Function.prototype) // Function,    
 console.log(typeof Object.prototype) // Object
 console.log(typeof Function.prototype.prototype) //undefined
Function.prototypeはなぜ関数の対象ですか?var A=new Function();Function.prototype=A上記で述べたように、new Functionによって生成されるオブジェクトはすべて関数オブジェクトです.Aは関数オブジェクトなので、関数オブジェクトです.その原型の対象は何に使いますか?主な役割は継承のためです.例を挙げます
var Person = function(name){
    this.name = name; // tip:          this     ?
  };
  Person.prototype.getName = function(){
    return this.name;  // tip:          this     ?
  }
  var person1 = new person('Mick');
  person1.getName(); //Mick
この例から、Person.prototypeに関数オブジェクトの属性を設定することによって、Personの例(person 1)から出た一般的なオブジェクトがこの属性を継承していることが分かる.具体的にどのように継承されているかは、次のプロトタイプチェーンに言及します.
上の二つのthisは誰を指しますか?
  var person1 = new person('Mick');
  person1.name = 'Mick'; //    person1     name      
  person1.getName(); //Mick  
したがって、2回のthisは関数実行時にperson 1を指します.
問題:「nullにプロトがない」と説明します.nullは独立したデータタイプですが、なぜtypeof(null)の値が「object」なのですか?
nullは空の引用ではなく、元の値です.ECMAScript 5.1中国語版*4.3.11節を参照してください.これはただここで一つの対象を引用することを期待しています.期待しています.null-JavaScript*.typeof nullの結果はobjectです.これは歴史的なバグです.type of-JavaScript*を参考にしてECMA 6では歴史的に平凡な提案がありました.typenullの値をnullに訂正しましたが、最後の提案は拒否されました.むしろ、誤解を続けて和事老となり、ハーモンを参考にしてください.null[ES Wiki]著者:クリリンリンク:https://www.zhihu.com/question/21691758/answer/987822
この文は私の学習モデルチェーンの中で一番明確な文章ですので、転載してください.ここから転載しますhttps://www.jianshu.com/p/dee9f8b14771