JS中的原型繼承

本文主要是講通過原型去實現繼承

假如有如下代碼:

function A() {
    this.name = 'A';
};
function B() {
    this.name = 'B';
};
A.prototype.whatever = function () {
    /*  write some code   */
};
B.prototype = new A()/*注意一下,這句代碼是關鍵,實現了B繼承A*/
B.prototype.constructor = B;//這句代碼的作用主要是把B的constructor重設爲B,要不然就會指向A
var c = new A();    
var b = new B();    

要實現繼承,就必須保證B繼承A以後,B所做的修改不能影響到A以及繼承自A的其他對象.

這裏主要介紹一下B.prototype = new A(),這句關鍵性的代碼所起的作用,

如果把這句代碼改成B.prototype = A的話,那麼這兩個對象的引用是完全一致的,這樣的話,如果賦值B.prototype.name = 45455,那麼A.name也會直接變成45455,直接把繼承自A的其他對象全部改了,根本談不上繼承.

如果把這段代碼改成B.prototype = A.prototype的話,也同樣會出現一樣的問題,修改B的原型就會把A的原型污染掉.

而B.prototype = new A()這句代碼,創建了一個新的json對象{},並且繼承了A的原型,這裏是一個新的對象,而不是和A的同一個引用,所以不會污染到A.

現在,我們先把 B.prototype 改成另外一個名字XXX,叫做XXX=new A();,當你請求XXX的whatever的時候,此時他不存在,將會向上,從構造函數也就是A裏面去找,也就是如下的效果:

B.prototype.whatever = XXX.whatever = A.prototype.whatever ;

就順利的請求到值了,並且不會污染到A.

總結:B完全繼承了A的東西,只要A原型裏有的,B的實例(通過new B產生的)都可以拿到,但是修改實例的屬性和方法,並不會影響到類(在本例子中指的就是構造函數),修改子類的屬性和方法不會影響父類,不同實例之間是不同的對象,並不相等

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章