標籤:
<!doctype html><html> <head> <title> call - apply for inherit </title> </head> <body> <script type="text/javascript"> function baseA() // base Class A { this.member = "baseA member"; this.showSelfA = function() { window.alert(this.member); } } function baseB() // base Class B { this.member = "baseB member"; this.showSelfB = function() { window.alert(this.member); } } function extendAB() // Inherit Class from A and B { baseA.call(this); // call for A baseB.call(this); // call for B } window.onload = function() { var extend = new extendAB(); extend.showSelfA(); // show A extend.showSelfB(); // show B } </script> </body></html>
運行結果如下:
baseB member
baseB member
測試環境:Google Chrome
結果分析:
預期的結果,應該是輸出 baseA member 和 baseB member,但實際輸出卻是 baseB member 和 baseB member
以這種方式去實現所謂的多繼承,結果:相同的變數會被覆蓋;
當然,我們也可以對上面baseA代碼稍作修改,來驗證我們調試分析的正確性:
function baseA() // base Class A{ this.memberA = "baseA member"; // member改成memberA,以區分baseB中的member this.showSelfA = function() { window.alert(this.memberA); // 顯示memberA }}
call 和apply 的一個誤區