面向?qū)ο?-第五彈繼承

繼承是什么?

  • 課本的介紹:子類可以繼承父類的方法和屬性,然后在這個基礎(chǔ)上進行添加方法和屬性??梢蕴岣叽a的復(fù)用性和效率。
  • 我的理解:繼承就是可以少些很多代碼。我們可以把之前的實現(xiàn)的方法和屬性,拿過來然后給新的對象用。
  • 遺憾的是,js并沒有天生的繼承機制。所以要我們自己來實現(xiàn)。怎么實現(xiàn)?請往下看。
  • 前面的文章講解了一些基礎(chǔ)知識。建議看看。:)
    怎么創(chuàng)建的對象詳細介紹

廢話說多了不好,直接看例子
  function Person(name,age){
        this.name = name;
        this.age = age;
    }
    Person.prototype.run = function(){
        console.log("I can run!!");
    }
    var p1= new Person('zhaobw',23);
    p1.run();

先在我們已經(jīng)有一個構(gòu)造函數(shù)Person了。這個構(gòu)造函數(shù)還有個方法run()
現(xiàn)在我們需要創(chuàng)建個新的構(gòu)造函數(shù)Student。這個構(gòu)造函數(shù)有屬性name、age方法run().還有一個新的屬性ID。我們該怎么寫?


   function Person(name,age){
        this.name = name;
        this.age = age;
    }
    Person.prototype.run = function(){
        console.log("I can run!!");
    }
    var p1= new Person('zhaobw',23);
    p1.run();
   function Student(name,age,id){
        this.name = name;
        this.age = age;
        this.id = id;
    }
    Person.prototype.run = function(){
        console.log("I can run!!");
    }
    var p1= new Person('zhaobw',23,20134540);
    p1.run();

對比一下student和Person。兩個函數(shù)只有一點點的不同。但是卻寫了好多的代碼。是不是很浪費。


現(xiàn)在我們用繼承來實現(xiàn)。
  function Person(name,age){
        this.name = name;
        this.age = age;
    }
    Person.prototype.run = function(){
        console.log("I can run!!");
    }
    function Student(name,age,id){
        Person.call(this,name,age);
        this.id = id;
    }
    Student.prototype = copy(Person.prototype);
    function copy(oldObj){
        var obj = new Object();
        obj.__proto__ = oldObj;
        return obj;
    };
    var s1 = new Student('z','23',12);
    s1.run();//I can run!!

結(jié)果證明Student繼承了Person


其他的寫法:

1

  function Person(name,age){
        this.name = name;
        this.age = age;
    }
    Person.prototype.run = function(){
        console.log("I can run!!");
    }
    function Student(name,age,id){
        Person.call(this,name,age);
        this.id = id;
    }
    Student.prototype = Object.create(Person.prototype);//這里發(fā)生了變化
    var s1 = new Student('z','23',12);
    s1.run();//I can run!!

2

   function Person(name,age){
        this.name = name;
        this.age = age;
    }
    Person.prototype.run = function(){
        console.log("I can run!!");
    }
    function Student(name,age,id){
        Person.call(this,name,age);
        this.id = id;
    }
    Student.prototype = copy(Person.prototype);
    function copy(oldObj){
        var newObj = function(){};
        newObj.prototype = oldObj;
        return new newObj();
    }
    var s1 = new Student('z','23',12);
    s1.run();

寫了這么多了。發(fā)現(xiàn)了規(guī)律了么?

  • 首先通過call來獲得父類的屬性。
  • 創(chuàng)建一個空對象,然后這個空對象的proto指向父類的prototype。
  • 子類的prototype的指向上面創(chuàng)建的空對象。

前面說了一堆的廢話。然后寫了一堆代碼??偨Y(jié)出來了上面的三句話。好好的理解。


知識拓展

為了更好的理解繼承,我多寫一點點額外的拓展。

  • instanceof 運算符用來測試一個對象在其原型鏈中是否存在一個構(gòu)造函數(shù)的 prototype 屬性。這個方法可以用來檢測對象的父類是誰。
    當然我們也可以自己封裝實現(xiàn):

    function _instanceof(obj,fn){
    var sign = obj.__proto__;
    while(sign){
      if(sign == fn.prototype){
            return true;
        }else{
            sign = sign.__proto__; 
        }
      }
    return false;
    }
    

  • hasOwnProperty是Object.prototype的一個方法
    判斷一個對象是否包含自定義屬性和方法,而不是原型鏈上的屬性和方法
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容