原型和原型鏈總結,通過原型實現繼承實現方法


JavaScript是一種動態類型、弱類型、基於原型的語言。

JavaScript數據類型

(ES5)6種:null,undefined,number,string,object

(ES6)8種:null,undefined,number,string,object,symbol,bigInt

原型重點: JavaScript 引用類型 Object

1.所有引用類型(Object),都有原型(__proto__)

2.實例化對象的原型(__proto__ )指向它的構造函數的原型(constructor.prototype)

3.所有引用類型(Object),他們的原型(__proto__)最終都指向 Object.prototype ,而Object.prototype.__proto__指向null

根據第3條:我們可以在Object.prototype 上動手腳,只要Object.prototype上定義方法,所有的對象都會“繼承”這個方法!

 

實現一個繼承

//js 實現繼承
//實際上就是
// 1.子構造函數 獲取父構造函數的成員函數,成員變量 
// 2.子原型 獲取父構造函數的原型(prototype)的拷貝
//繼承方法:
//       子實例 ----> 子prototype  +  子constructor() 
//                         ↑                 ↑
//                    父prototype     父constructor()
//

function Parent(pname) {
  var pname = pname;//私有成員變量
  this.father = "公有成員變量"
  this.psay = function () { 
    console.log("Parent:"+pname);
  }
}
Parent.prototype.ps = function () { 
  console.log("this is Parent set")
}

function Child(cname,pname) { 
  Parent.call(this, pname);//構造函數繼承=?就是將自己的環境扔進去,獲取附加的方法
  var cname = cname;
  this.csay = function () { 
    console.log("childName: "+cname)
  }
}

function GrandChild(gname, cname, pname) { 
  Child.call(this, cname, pname);
  this.gname = gname;
  this.gsay = function () { 
    console.log("grandChildName :"+ this.gname);
  }
}

//創建繼承原型
function create(constructor) { 
  //1.為啥要怎么寫?
  //因為新實例 將放入原型,我們僅僅需要 原型繼承 
  //如果需要繼承的方法中有 構造函數,通過有構造函數生成的實例,和我們所需要的原型繼承不相符
  //所以需要新建一個空的構造函數,以保證僅僅是原型繼承
  //2.為啥不能直接用 Child.prototype = Parent.prototype ?
  // 因為new生成的實例時一個新的對象 其中包含prototype 的引用
  // 直接引用prototype 會造成:
  // 后續向原型添加方法時,影響父方法(引用了同一個prototype)
  let F = function () { }
  F.prototype = constructor.prototype;
  return new F();
}

//原型繼承(形成原型鏈)
// Child.prototype = Parent.prototype;
Child.prototype = create(Parent);
Child.prototype.child = "child";
GrandChild.prototype = create(Child);


let g = new GrandChild("孫", "子", "父");
g.psay();
g.csay();
g.gsay();
g.ps();

let p = new Parent("xxx");
console.log(g);
console.log(p.child) 

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM