日韩无码专区无码一级三级片|91人人爱网站中日韩无码电影|厨房大战丰满熟妇|AV高清无码在线免费观看|另类AV日韩少妇熟女|中文日本大黄一级黄色片|色情在线视频免费|亚洲成人特黄a片|黄片wwwav色图欧美|欧亚乱色一区二区三区

RELATEED CONSULTING
相關(guān)咨詢
選擇下列產(chǎn)品馬上在線溝通
服務(wù)時間:8:30-17:00
你可能遇到了下面的問題
關(guān)閉右側(cè)工具欄

新聞中心

這里有您想知道的互聯(lián)網(wǎng)營銷解決方案
論Javascript的類繼承

說到Javascript類繼承,就必然離不開原型鏈,但只通過原型鏈實現(xiàn)的繼承有著不少缺陷。

無參數(shù)類繼承的問題

先看一段示例代碼,實現(xiàn)B繼承于A:

 
 
 
  1. function A() {  
  2. }  
  3. A.prototype.a1 = function() {  
  4. };  
  5. function B() {  
  6. }  
  7. B.prototype = new A();  
  8. B.prototype.b1 = function() {  
  9. };  
  10. var b = new B();  
  11. alert(b.constructor == A); // true  
  12. alert(b.constructor == B); // false 

 

這段代碼的主要問 題是:

1、需要實例化A作為B的原型,此時就執(zhí)行了A的構(gòu)造函數(shù)。但按照面向?qū)ο蟮囊?guī)則,實例化B之前,B及其父類A的構(gòu)造函數(shù)都不應(yīng)該執(zhí)行。

2、更改了B的prototype,導(dǎo)致b.constructor不是B而是A。

有參類繼承的問題

假設(shè)A和B都有兩個字符串參數(shù)s1和s2,A中計算了兩段字符串的總長度,B直接以s1、s2為參數(shù)調(diào)用A:

 
 
 
  1. function A(s1, s2)   
  2. {  
  3. this.totalLength = s1.length + s2.length;  
  4. }  
  5. A.prototype.a1 = function()   
  6. {  
  7. };  
  8. function B(s1, s2)   
  9. {  
  10. }  
  11. B.prototype = new A();  
  12. B.prototype.b1 = function()   
  13. {  
  14. };  
  15. new B(“ab”, “123″); 

 

可以看到,這段代碼中根本沒有辦法把s1和s2傳到A,而又因為實例化A作為B的原型時沒有 參數(shù),所以出現(xiàn)了異常:

 
 
 
  1. s1 is undefined 

 

解決方案

s1 和s2的作用域只在B內(nèi),要把它們傳到A,就只能在B中操作,借助函數(shù)的apply方法就可以實現(xiàn)之:

 
 
 
  1. function B(s1, s2)   
  2. {  
  3. A.apply(this, arguments);  
  4. alert(this.totalLength);  

 

接下來的問題就是如何把A的方法添加到B的原型中去。這也不 難,只要遍歷A.prototype,把方法復(fù)制到B.prototype即可。要注意的是,對于同名的方法,自然是子類優(yōu)先(重載), 因而不能覆蓋:

 
 
 
  1. for (var m in A.prototype)   
  2. {  
  3. if (!B.prototype[m])   
  4. { // 父類不能覆蓋子類的方法  
  5. B.prototype[m] = A.prototype[m];  
  6. }  

網(wǎng)頁題目:論Javascript的類繼承
轉(zhuǎn)載來于:http://m.5511xx.com/article/djhijhs.html