1. 程式人生 > >js組合繼承(原型繼承+借用構造函數繼承)

js組合繼承(原型繼承+借用構造函數繼承)

.com cnblogs ont 李克強 技術分享 賦值 const end 引用


組合繼承就是將原型鏈和構造函數結合起來發揮二者優勢的一種模式。
繼承:是類型與類型之間的繼承
繼承目的:
把子類型相同成員提取到父類型,實現代碼重用 大體思路是:
使用原型鏈實現對原型屬性和方法的繼承,而通過借用構造函數來實現對實例屬性的繼承,很好地解決了原型鏈繼承的缺點,是較為常用的一種繼承方式。
//一:借用構造函數(借用父類型extend) 缺點:無法繼承父類型的方法
//父類型    
function Person(name,age,sex){
  this.anme=name;
this.age=age;
this.sex=sex;
}
Person.prototype.sayHi=function (){
  console.log(this.name);
}
//子類型
function Student(name,age,sex,score){
  Person.call(this,name,age,sex); //借用父類型extend

   this.score=score;
}

Student.prototype.siyou = function () { console.log(‘只是Student私有,Person訪問不到‘) }
 
var s1=new Student(‘李克強‘,19,‘男‘,100);
console.dir(s1);

//二:原型繼承 缺點:無法設置參數
Student.prototype= new Person();
Student.prototype.constructor=Student;

// Student.prototype = Person.prototype; //原型extend // 但是這樣寫,會造成子類型添加了私有方法其他的子類型 或者 父類型 都能訪問到 // 因為堆內存中prototype 只有一個,Student.prototype = Person.prototype // 只是賦值給Student.prototype一個引用地址,他們都指向內存中的同一個 prototype
 
// new Person() 是:Person實例對象(作為Student的原型對象) //實現原型繼承 必須將 constructor 指向自身 //否則的話:Student.prototype 的__proto__指向Person
技術分享圖片
技術分享圖片
 

//擴展:如何證明 fn是Function的實例對象?
fn.__proto__ ===Function.prototype //true
 
 


js組合繼承(原型繼承+借用構造函數繼承)