js五種繼承優缺點


      

  //1.原型繼承
  //缺點: 當父級的屬性有引用類型的時候,任意一個實例修改了這個屬性,其他實例都會受影響
   // 1)基本類型:Number Boolean String undefined null
   // 2)引用類型:Object Function
function Person(){
this.class = '人';
this.name = '張三';
this.say = function(){
console.log(this.name);
}
};

function Man(name,age){
this.name = name;
this.age = age;
};
Man.prototype = new Person();
var man = new Man('廣發',18);
console.log(man);

  //2.借用構造函數繼承
    //缺點:父類的方法會被創建多次
function Person(){
this.class = '人類';
this.say = function(){
console.log('我是人類');
}
}
function Man(name,age){
this.name = name;
this.age = age;
//借用構造函數
Person.call(this);
}
var man = new Man('廣發',18);
console.log(man);
var man2 = new Man('廣發',20);
console.log(man.say===man2.say);//false

  //3寄生式繼承
function Person(o){ //參數o是一個傳進來的對象
缺點:沒用到原型,無法復用
var obj = Object.create(o);
//console.log(obj._proto_ === o); //false
obj.class = '人類';
obj.say = function(){
console.log(this.name);
}
return obj;
}
//要傳入的對象
var aman = {
name:'廣發',
age:100
}
var man = Person(aman);
console.log(man);

  //4.組合式繼承
    //唯一缺點:父類的構造器被調用了兩次
function Father(){ //父級
this.class = '人類';
alert('測試被調用多少次');
};

Father.prototype.say = function(){ //把方法放到原型里
console.log(this.name);
}
function Child(name,age){
this.name = name;
this.age = age;
Father.call(this);//借用構造函數
}
Child.prototype = new Father();//Child原型繼承了Father,這樣就可以調用原型里面的方法了
var man = new Child('廣發',18);
console.log(man);
var man2 = new Child('廣發',20);
console.log(man.say === man2.say);//true,因為在原型里面都能調用,所以他們這個方法是相等的

 

  // 5 終極版 寄生組合式繼承
    //什么?缺點?你信不信我打你
function Person(){
this.class = '人類';
alert('測試調用了幾次');
}
Person.prototype.say = function(){
console.log(this.name);
}
Man.prototype = Object.create(Person.prototype);
function Man(name,age){
this.name = name;
this.age = age;
Person.call(this);
}
var man = new Man('廣發',18);
console.log(man);

有時候玩着玩着就找不到原型構造器了,所以我們要重新找回構造器

//構造器重定向(找回構造器)
Man.prototype.constructor = Man;

1. 每個函數都包含兩個非繼承而來的方法:call()方法和apply()方法。

2. 相同點:這兩個方法的作用是一樣的。

都是在特定的作用域中調用函數,等於設置函數體內this對象的值,以擴充函數賴以運行的作用域。

一般來說,this總是指向調用某個方法的對象,但是使用call()和apply()方法時,就會改變this的指向。

說明: call方法可以用來代替另一個對象調用一個方法,call方法可以將一個函數的對象上下文從初始的上下文改變為thisObj指定的新對象,如果沒有提供thisObj參數,那么Global對象被用於thisObj。

簡單明了

 apply:調用一個對象的一個方法,用另一個對象替換當前對象。例如:B.apply(A, arguments);即A對象應用B對象的方法。
call:調用一個對象的一個方法,用另一個對象替換當前對象。例如:B.call(A, args1,args2);即A對象調用B對象的方法。


免責聲明!

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



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