<rt id="bn8ez"></rt>
<label id="bn8ez"></label>

  • <span id="bn8ez"></span>

    <label id="bn8ez"><meter id="bn8ez"></meter></label>

    道非道 非常道

    勤思、謹(jǐn)言、慎行、厚積、薄發(fā)

    統(tǒng)計(jì)

    web

    天圓

    經(jīng)濟(jì) 政治 軍事

    鍵康

    [轉(zhuǎn)] javascript的prototype繼承

      轉(zhuǎn)自:http://www.cnblogs.com/goody9807/archive/2007/04/16/715109.html
     
    基本的用法 把ClassA的一個(gè)實(shí)例賦值給ClassB ClassB就繼承了ClassA的所有屬性

    <script>
    function ClassA()
    {
        
    this.a='a';
    }

    function ClassB()
    {
        
    this.b='b';
    }

    ClassB.prototype
    =new ClassA();
    var objB=new ClassB();
    for(var p in objB)document.write(p+"<br>");
    </script>


    從原型繼承理論的角度去考慮 js的原型繼承是引用原型 不是復(fù)制原型
    所以 修改原型會(huì)導(dǎo)致所有B的實(shí)例的變化

    <script>
    function ClassA()
    {
        
    this.a='a';
    }

    function ClassB()
    {
        
    this.b='b';
    }

    ClassB.prototype
    =new ClassA();
    var objB=new ClassB();
    alert(objB.a);
    ClassB.prototype.a
    ='changed!!';
    alert(objB.a);
    </script>


    然而 子類對象的寫操作只訪問子類對象中成員 它們之間不會(huì)互相影響
    因此 寫是寫子類 讀是讀原型(如果子類中沒有的話)

    <script>
    function ClassA()
    {
        
    this.a='a';
    }

    function ClassB()
    {
        
    this.b='b';
    }

    ClassB.prototype
    =new ClassA();
    var objB1=new ClassB();
    var objB2=new ClassB();
    objB1.a
    ='!!!';
    alert(objB1.a);
    alert(objB2.a);
    </script>


    每個(gè)子類對象都執(zhí)有同一個(gè)原型的引用 所以子類對象中的原型成員實(shí)際是同一個(gè)

    <script>
    function ClassA()
    {
        
    this.a=function(){alert();};
    }

    function ClassB()
    {
        
    this.b=function(){alert();};
    }

    ClassB.prototype
    =new ClassA();
    var objB1=new ClassB();
    var objB2=new ClassB();
    alert(objB1.a
    ==objB2.a);
    alert(objB1.b
    ==objB2.b);
    </script>



    構(gòu)造子類時(shí) 原型的構(gòu)造函數(shù)不會(huì)被執(zhí)行
    <script>
    function ClassA()
    {
        alert(
    "a");
        
    this.a=function(){alert();};
    }

    function ClassB()
    {
        alert(
    "b");
        
    this.b=function(){alert();};
    }

    ClassB.prototype
    =new ClassA();
    var objB1=new ClassB();
    var objB2=new ClassB();
    </script>


    接下來是致命的,在子類對象中訪問原型的成員對象:
    <script>
    function ClassA()
    {
        
    this.a=[];
    }

    function ClassB()
    {
        
    this.b=function(){alert();};
    }

    ClassB.prototype
    =new ClassA();
    var objB1=new ClassB();
    var objB2=new ClassB();
    objB1.a.push(
    1,2,3);
    alert(objB2.a);
    //所有b的實(shí)例中的a成員全都變了!!
    </script>


    所以 在prototype繼承中 原型類中不能有成員對象! 所有成員必須是值類型數(shù)據(jù)(string也可以)

    用prototype繼承有執(zhí)行效率高,不會(huì)浪費(fèi)內(nèi)存,為父類動(dòng)態(tài)添置方法后子類中馬上可見等的優(yōu)點(diǎn)。

    我就非常喜歡用prototype繼承。

    prototype繼承是通過把子類的原型對象(prototype)設(shè)置成父類的一個(gè)實(shí)例來進(jìn)行繼承的。

    只簡單的這樣設(shè)置繼承的確如樓主所說,有不少缺點(diǎn)。總的來說有四個(gè)缺點(diǎn):

    缺點(diǎn)一:父類的構(gòu)造函數(shù)不是像JAVA中那樣在給子類進(jìn)行實(shí)例化時(shí)執(zhí)行的,而是在設(shè)置繼承的時(shí)候執(zhí)行的,并且只執(zhí)行一次。這往往不是我們希望的,特別是父類的構(gòu)造函數(shù)中有一些特殊操作的情況下。

    缺點(diǎn)二:由于父類的構(gòu)造函數(shù)不是在子類進(jìn)行實(shí)例化時(shí)執(zhí)行,在父類的構(gòu)造函數(shù)中設(shè)置的成員變量到了子類中就成了所有實(shí)例對象公有的公共變量。由于 JavaScript中繼承只發(fā)生在“獲取”屬性的值時(shí),對于屬性的值是String,Number和Boolean這些數(shù)據(jù)本身不能被修改的類型時(shí)沒有 什么影響。但是Array和Object類型就會(huì)有問題。
    缺點(diǎn)三:如果父類的構(gòu)造函數(shù)需要參數(shù),我們就沒有辦法了。

    缺點(diǎn)四:子類原本的原型對象被替換了,子類本身的constructor屬性就沒有了。在類的實(shí)例取它的constructor屬性時(shí),取得的是從父類中繼承的constructor屬性,從而constructor的值是父類而不是子類。


    我也曾經(jīng)為了這四個(gè)缺點(diǎn)頭疼過,于是對prototype繼承進(jìn)行改造。
    我試了幾種方法,下面是我覺得最好的一種。我把它寫成Function對象的一個(gè)方法,這樣用的時(shí)候方便。方法如下:
    //類的繼承-海浪版
    Function.prototype.Extends = function (parentClass)
    {
      
    var Bs = new Function();
      Bs.prototype 
    = parentClass.prototype;
      
    this.prototype = new Bs();
      
    this.prototype.Super = parentClass;
      
    this.prototype.constructor = this;
    }

    posted on 2009-07-08 14:04 星期五 閱讀(181) 評論(0)  編輯  收藏 所屬分類: web 開發(fā)

    主站蜘蛛池模板: 亚洲人成无码久久电影网站| 中文字幕在线日亚洲9| 中文文字幕文字幕亚洲色| 老湿机一区午夜精品免费福利| 2022国内精品免费福利视频| 97在线线免费观看视频在线观看| 亚洲精品tv久久久久久久久久| 亚洲黄色网站视频| 黄网站色成年片大免费高清| 蜜桃AV无码免费看永久| 亚洲高清成人一区二区三区| 大胆亚洲人体视频| 亚洲狠狠ady亚洲精品大秀| 边摸边吃奶边做爽免费视频网站 | 美女被爆羞羞网站免费 | 18级成人毛片免费观看| 亚洲制服中文字幕第一区| 国产亚洲精aa在线看| 伊人久久大香线蕉免费视频| 成年性午夜免费视频网站不卡| 国产亚洲av片在线观看播放| 自拍偷自拍亚洲精品被多人伦好爽 | 国产大片线上免费观看| 亚洲色无码专区在线观看| 亚洲熟女精品中文字幕| 香港经典a毛片免费观看看| 亚洲无砖砖区免费| 亚洲中文字幕久久精品无码APP | 久久成人国产精品免费软件| 国产成人精品久久亚洲| 亚洲人成电影网站免费| 亚洲视频免费在线观看| 亚洲一区二区三区偷拍女厕 | 毛片a级三毛片免费播放| 亚洲爱情岛论坛永久| va天堂va亚洲va影视中文字幕| 国产在线精品免费aaa片| 亚洲女同成人AⅤ人片在线观看| 亚洲一区二区观看播放| 最近中文字幕2019高清免费| 亚洲AV无码成人专区片在线观看|