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)