您好,登錄后才能下訂單哦!
本篇內容介紹了“Javascript的類繼承是什么”的有關知識,在實際案例的操作過程中,不少人都會遇到這樣的困境,接下來就讓小編帶領大家學習一下如何處理這些情況吧!希望大家仔細閱讀,能夠學有所成!
說到Javascript的類繼承,就必然離不開原型鏈,但只通過原型鏈實現的繼承有著不少缺陷。
無參數類繼承的問題
先看一段示例代碼,實現B繼承于A:
function A() { } A.prototype.a1 = function() { }; function B() { } B.prototype = new A(); B.prototype.b1 = function() { }; var b = new B(); alert(b.constructor == A); // true alert(b.constructor == B); // false
這段代碼的主要問 題是:
1、需要實例化A作為B的原型,此時就執行了A的構造函數。但按照面向對象的規則,實例化B之前,B及其父類A的構造函數都不應該執行。
2、更改了B的prototype,導致b.constructor不是B而是A。
有參類繼承的問題
假設A和B都有兩個字符串參數s1和s2,A中計算了兩段字符串的總長度,B直接以s1、s2為參數調用A:
function A(s1, s2) { this.totalLength = s1.length + s2.length; } A.prototype.a1 = function() { }; function B(s1, s2) { } B.prototype = new A(); B.prototype.b1 = function() { }; new B(“ab”, “123″);
可以看到,這段代碼中根本沒有辦法把s1和s2傳到A,而又因為實例化A作為B的原型時沒有 參數,所以出現了異常:
s1 is undefined
解決方案
s1 和s2的作用域只在B內,要把它們傳到A,就只能在B中操作,借助函數的apply方法就可以實現之:
function B(s1, s2) { A.apply(this, arguments); alert(this.totalLength); }
接下來的問題就是如何把A的方法添加到B的原型中去。這也不 難,只要遍歷A.prototype,把方法復制到B.prototype即可。要注意的是,對于同名的方法,自然是子類優先(重載), 因而不能覆蓋:
for (var m in A.prototype) { if (!B.prototype[m]) { // 父類不能覆蓋子類的方法 B.prototype[m] = A.prototype[m]; } }
“Javascript的類繼承是什么”的內容就介紹到這里了,感謝大家的閱讀。如果想了解更多行業相關的知識可以關注億速云網站,小編將為大家輸出更多高質量的實用文章!
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。