class 與 原型鏈 解析

這篇文章只是我我的的看法,由於也是今年剛畢業,因此理解不必定很是的準確,若是理解有誤但願你們告訴我。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__中查找。」
相關文章
相關標籤/搜索