這篇文章只是我我的的看法,由於也是今年剛畢業,因此理解不必定很是的準確,若是理解有誤但願你們告訴我。es6
1、class 至關於 拿實例對象的名字 來給 原型 命名。函數
爲何這麼說呢。this
先說說 es6中的用法 :es5
class testClass{ constructor(name,age){ this.name = name; this.age = age; } printFn() { console.log(this.age); } } new testClass('hello',18).printFn()//18
這個類用 es5怎麼寫呢:prototype
function testProto(name,age) { this.name = name; this.age = age; } testProto.prototype.printFn = function(){ console.log(this.age); } new testProto('hello',18).printFn();
其實寫法上是差不太多的。code
不專業點說:class的實例函數(constructor)爲匿名函數,而es5中,構造函數(即原型鏈prototype展現的原型)爲匿名函數。
class例子中,class是有名字的 —— testClass,每一個類的constructor惟一,就像每本書的目錄 是惟一的,那麼翻書的時候,正常說法就是打開 某本書的目錄,而不用特地去給目錄命名。對象
es5例子中,實例函數的名字是惟一的 —— testProto,他的構造對象,就是,他的原型鏈對象,testProto.prototype。這就像老師找學生家長聊天同樣,通常老師都會說,讓某同窗(testProto)的媽媽(prototype)過來一下,某同窗的名字已知,那麼他的媽媽也就肯定了。當實例化的時候(new testProto()),這個對象的名字就是以某同窗的名字命名的。原型鏈
prototype,constructor,__proto__關係圖(不經過create創造,不經過各類狀況擾亂的狀況下分析);
prototype爲原型屬性,展現構造函數,好比上面舉例的某同窗的媽媽(構造函數)。某同窗就是他媽媽生(實例)的對象。這個用類的思想比較好理解,咱們平時調用的方法,其實都是一個原型的實例化(constructor)。
實例化對象以後,屬性會存在於對象的__proto__中,當調用一個屬性的時候,若是這個對象中沒有,就回去他的__proto__中查找。
舉個例子:原型
function test1() {console.log('test1')}; test1.prototype.test2 = function(){console.log(0)}; new test1().__proto__ .test2 == new test1().test2//true; new test1()實例化以後的結構大概以下: test1 { __proto__:{ construtor:function(){console.log('test1')}, test2: function(){console.log(0)} } } construtor會被當即執行 因此 控制檯會分別打印出 test1 ;test1 ;true;第一個test1 是執行new test1().__proto__ .test2這句話時候打印出來的,第二個test1是執行這句話new test1().test2的時候打印出來的。 new test1().constructor == test1//true; new test1().__proto__.constructor == test1 //true; 這句話能夠證實「咱們平時調用的方法,其實都是一個原型的實例化(constructor)。實例化對象以後,屬性會存在於對象的__proto__中,當調用一個屬性的時候,若是這個對象中沒有,就回去他的__proto__中查找。」