詳解原型鏈,面向對象(下)

接上文:es6

1.類的聲明
function Animal (){
 this.name="name";
}
es6:
 class Animal2{
  constructor(){
    this.name="name";
  }
}
2.生成實例 new Animal(),new Animal2,若是new的時候沒有參數,也能夠不加括號
3.繼承的實現
   >call方法(經過構造函數實現繼承)
     

     缺點:沒法繼承來自Parent1的原型上的東西,只能部分繼承函數

   >原型鏈繼承測試

     

     缺點:
     改變了s1的屬性同時也會影響到s2,由於原型鏈中的原型對象是公用的
     注:實際上new出來的新類.name是不存在的,經過查找新類.__proto__.name纔會有,因此是在原型鏈上查找出來的
  >組合方式(企業通用方法)
     
     缺點:new 2次,構造函數被執行了2次
     第一次:s3的new時候 Child3的構造函數被執行了一次
     第二次:Child3的原型new Parent3的時候
      :其實s3和s4分別有兩套name和play,一份是call出來的,使用時直接s3.name,能夠得出,一份是原型鏈上的s3.__proto__.name能夠得出,該方法只是在call的基礎上把parent的原型鏈繼承給了Child3而已
   >優化
     
     缺點:constroctor指向父類
   >優化
     測試過程當中也能夠
function Parent4 () {
    this.name = 'parent4';
    this.play = [1, 2, 3];
}
function Child4 () {
    Parent4.call(this);
    this.type = 'child4';
}
Child4.prototype = Parent4.prototype;
Child4.prototype.constructor=Child4;
var s5 = new Child4();
var s6 = new Child4();
console.log(s5, s6);
 
console.log(s5 instanceof Child4, s5 instanceof Parent4);
console.log(s5.constructor);
     將constructor設置回來便可,可是父類和子類的
     constructor都變成子類了

    >終極優化優化

     

     var o=Object.create(parent)是把參數parent當作原型對象傳給o的,因此o並不具有parent的屬性,可是o的__proto__具備,由於o.__proto__===parentthis

     總結:原型鏈繼承因爲new的時候是把原型對象上的屬性複製給新對象,因而新對象至關於有兩個相同屬性,若是新對象爲o,那麼他既有o.name,又有o.__proto__.name,修改兩個的時              候互不影響,可是會影響原型鏈就是原型對象的.prototype,繼而影響全部new出來的新對象spa

     若有錯誤,請多指正prototype

相關文章
相關標籤/搜索