js-繼承

一、構造函數綁定
使用call或apply方法,將父對象的構造函數綁定在子對象上,即在子對象構造函數中加一行。Animal.apply(this, arguments);
二、prototype模式
  Cat.prototype = new Animal();
  Cat.prototype.constructor = Cat; //糾回prototype對象的constructor值
三、直接繼承
  function Animal(){ }
  Animal.prototype.species = "動物";
將Cat的prototype對象,然后指向Animal的prototype對象,這樣就完成了繼承
Cat.prototype = Animal.prototype;
  Cat.prototype.constructor = Cat;
與前一種方法相比,這樣做的優點是效率比較高(不用執行和建立Animal的實例了),比較省內存。缺點是 Cat.prototype和Animal.prototype現在指向了同一個對象,那么任何對Cat.prototype的修改,都會反映到Animal.prototype。
四、非構造函數的繼承
1、使用object()方法
  function object(o) {
    function F() {}
    F.prototype = o;
    return new F();
  }
var Doctor = object(Chinese);
2、淺拷貝
把父對象的屬性,全部拷貝給子對象,也能實現繼承。
function extendCopy(p) {
    var c = {};
    for (var i in p) {
      c[i] = p[i];
    }
    c.uber = p;
    return c;
  }
var Doctor = extendCopy(Chinese);
  Doctor.career = '醫生';
  alert(Doctor.nation); // 中國
這樣的拷貝有一個問題。那就是,如果父對象的屬性等于數組或另一個對象,那么實際上,子對象獲得的只是一個內存地址,而不是真正拷貝,因此存在父對象被篡改的可能。
3、深拷貝
所謂"深拷貝",就是能夠實現真正意義上的數組和對象的拷貝。它的實現并不難,只要遞歸調用"淺拷貝"就行了。
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;
  }
//更改子對象不會影響父對象。

最后編輯于
?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。

推薦閱讀更多精彩內容

  • 開山例子 需求:學生交學費,中學生打8折;小學生打5折,然后通過打印的方法,顯示學生的名字、年齡記應繳學費。 我們...
    jayafs閱讀 575評論 0 50
  • 1:原型繼承 為了讓子類繼承父類的屬性(也包括方法),首先需要定義一個構造函數。然后,將父類的新實例賦值給構造函數...
    codeSirCao閱讀 262評論 0 0
  • 繼承大致分為兩類: ——基于構造器工作模式 ——基于對象模式 1、原型鏈法(仿傳統)——使用原...
    CollinHsu閱讀 350評論 0 0
  • 這個系列的第一部分,主要介紹了如何"封裝"數據和方法,以及如何從原型對象生成實例。 今天要介紹的是,對象之間的"繼...
    云端漫記閱讀 237評論 0 0
  • 發動機 (1)按照所用燃料分類 內燃機按照所使用燃料的不同可以分為汽油機和柴油機。使用汽油為燃料的內燃機稱為汽油機...
    卓銳_151a閱讀 454評論 0 3