js面向對象3:非構造函數的繼承

什麼是非構造函數的繼承

A:

var Chinese={
nation:'中國'
}

B:

var Doctor={
 career:'醫生'
}

如何讓B繼承A呢?
也就是說如何生成一個“中國醫生”的對象。

object()方法

funciton object(o){   // object函數就是讓子對象的prototype屬性指向父對象,
                      // 從而使得子對象與父對象連在一起。
    function F() {};
    F.prototype=o;
    return new F();

}
var Doctor=object(Chinese);//在父對象的基礎上生成子對象
Doctor.career='醫生';  //將職業屬性給Doctor加上
alert(Doctor.nation);//中國

淺拷貝

將父對象的屬性都拷貝給子對象

function extendCopy(p){
  var c={};
  for(var i in p){
      c[i]=p[i];
 
   }
   return c;
}

var Doctor=extendCopy(Chinese);
Doctor.career='醫生';
alert(Doctor.nation); // 中國

但是這樣做有一個隱患,如果父對象的屬性是一個數組或者一個對象時,子對象拷貝只是拿到內存地址,這就使得父對象存在被篡改的可能性,如:

Chinese.birthPlaces=['上海','北京','江西'];
var Doctor=extendCopy(Chinese);
Doctor.birthPlaces.push('廈門');

 alert(Doctor.birthPlaces); //北京, 上海, 香港, 廈門
 alert(Chinese.birthPlaces); //北京, 上海, 香港, 廈門

extendCopy()只是拷貝基本類型的數據,我們把這種拷貝叫做"淺拷貝"。這是早期jQuery實現繼承的方式。

深拷貝

function deepCopy(p,c){
   var c=c||{};
   for(var i in p){
          if(typeof p[i]=== 'object'){
                c[i]=(p[i].constructor===Array)?[]:{};
                deepCopy(p[i],c[i]);
          }else{
          c[i]=p[i];
          }
   }

return c;
}
var Docotr=deepCopy(Chinese);
Chinese.birthPlaces=['上海','北京','江西'];
 Doctor.birthPlaces.push('廈門');
  alert(Doctor.birthPlaces); //北京, 上海, 香港, 廈門

  alert(Chinese.birthPlaces); //北京, 上海, 香港
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章