国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 語言 > JavaScript > 正文

JS偽繼承prototype實現方法示例

2024-05-06 15:33:17
字體:
來源:轉載
供稿:網友

本文實例講述了JS偽繼承prototype實現方法。分享給大家供大家參考,具體如下:

眾所周知JS中沒有類的概念,但是要想實現類的功能可以同過function模擬。如:

第一種繼承 (屬性繼承)

  //該函數相當于是一個構造器,也是一個偽類  function Fn(){    this.a = 4;    this.b = 5;    this.log = function(){      console.log(this.a,this.b);    }  }  function Fn1(){    Fn.call(this);//調用父類的構造函數  }  Fn1.prototype = Fn.prototype;  var fn = new Fn();  var fn1 = new Fn1();  //由此可見Fn1 是fn1的子類。  fn1 instanceof Fn; // true  fn instanceof Fn1; // true  fn.a = 5;  //由此可見Fn1 繼承了 Fn得所有屬性和方法  //而是是復制了一份Fn的屬性和方法,并不是對象的引用。  console.log(fn.a); // 5  console.log(fn1.a); // 4  this.log(); // 4 5

總結: 這種繼承,是重新拷貝一份放入內存中,他們的值互相獨立,修改一個不會改變另一個。

第二種繼承 原型繼承(prototype)

  function Fn(){}  Fn.prototype.data = {    name: 'zhangsan'  }  Fn.prototype.getName = function(){    return this.data.name;  }  function Fn1(){}  //原型鏈繼承  Fn1.prototype = Fn.prototype;  var fn = new Fn();  var fn1 = new Fn1();  //所用Fn1 繼承了 Fn  fn1 instanceof Fn;//true  console.log(fn1.getName()); // zhangsan  console.log(fn.getName()); // zhangsan  //修改了fn的name屬性值  fn.data.name = 'lisi';  // 由此我們可看出 原型鏈繼承 是 引用繼承  //不會重新拷貝一份變量。就像對象的引用一樣。  console.log(fn.getName()); // lisi  console.log(fn1.getName()); // lisi

兩種類的寫法造成示例的區別

  //第一種  function Fn(){    this.a = 4;    this.b = 5;    this.log = function(){      console.log(this.a,this.b);    }  }  var fn1 = new Fn();  var fn2 = new Fn();  fn1.a = 1;  //由此可以看出兩個對象互不影響  //說明每個對象里都存在一份a和b  fn1.log(); // 1 5  fn2.log(); // 4 5  //第二種  function Fn(){}  fn.prototype.name = 'zhangsan';  fn.prototype.data = {    a: 4,    b: 5  }  fn.prototype.log = function(){    console.log(this.data.a,this.data.b);  }  var fn1 = new Fn();  var fn2 = new Fn();  fn1.a = 1;  //由此可見就算是不同的示例他們他們所指向的值是同一個。  fn1.log();//1 5  fn2.log();//1 5  fn2.name = 'lisi';  //這里fn1.name并沒有被修改  console.log(fn1.name); //zhangan  console.log(fn2.name); // lisi

總結

類中直接this. 出來的屬性和方法都會直接復制一份給子類或者實例對象。個子類或實例對象之間互不影響。

使用prototype增加的屬性和方法,對象類型的只有一份,值類型的這會被復制。

收獲

由于函數都是通用的,所以比較上面兩種方法,第二種明顯比第一種性能要好的多,因為避免了沒有必要的復制,肯定會比較節省內存。所以以后寫類的時候,盡量使用第二種方式。

發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表

圖片精選

主站蜘蛛池模板: 海原县| 勃利县| 紫阳县| 都昌县| 嘉禾县| 张家界市| 翁源县| 乌鲁木齐市| 綦江县| 伊春市| 巴东县| 石屏县| 乌拉特前旗| 塔城市| 泊头市| 南和县| 澜沧| 德令哈市| 汉源县| 肇源县| 墨竹工卡县| 高雄县| 即墨市| 安塞县| 林西县| 商丘市| 昭通市| 三门峡市| 元阳县| 东城区| 江城| 桑植县| 盈江县| 永城市| 扬中市| 满洲里市| 通海县| 陈巴尔虎旗| 合肥市| 桂林市| 襄汾县|