JavaScript之物件導向的繼承淺析2

rowanit3發表於2016-02-21
  • 其他oop語言Java,C#,C++,PHP中的繼承
    例如在PHP中的繼承:
    <1> 物件的組成: 屬性、方法
    <2> 繼承物件的屬性、方法
    <3> 繼承步驟:先執行父級的建構函式;再新增自身的屬性和方法

  • JavaScript中的繼承(只談組合繼承)
    ①屬性的繼承: 建構函式的偽裝 :.call() || .apply()

    ②方法的繼承: 通過原型鏈
    父類例項化物件賦給子類原型物件 或 for-in迴圈 子類.prototype[i] = 父類.prototype[i]

    ③ 注意:在子類繼承中,要先繼承父類,然後再用原型方法寫自己獨有的方法,不然後寫的話會覆蓋掉子類的方法。

    //父類Person
    function Person(name,sex){
        this.name = name;
        this.sex = sex;
    }
    Person.prototype.sayName = function(){
        alert("My Name is " + this.name);
    }
    Person.prototype.saySex = function(){
        alert("My Sex is " + this.sex);
    }

    //Worker子類繼承
    function Worker(name,sex,job){
        //此處用call方法來繼承Person類中的屬性,說穿了就是繼承name和sex
        Person.call(this,name,sex);

        //學名:  建構函式的偽裝!!!
        this.job = job;
    }
    //此處直接通過原型繼承父級Person類中方法
    //Worker.prototype = Person.prototype;     學名:原型鏈!注意:其中涉及了物件的引用,有問題

    //如果用上述直接引用父類的話 會對父類造成影響,所以為了不影響父類,不能採用上述方法用for-in迴圈來做
    for(var i in Person.prototype){
        Worker.prototype[i] = Person.prototype[i];
    }

    //再新增自身(子類(Worker類))的方法
    Worker.prototype.showJob = function(){ 
        alert(this.job);
    }


相關文章