原生JS大揭祕—看清JS繼承本質

JS繼承

理論源於生活、又高於生活
在JS中「繼承」,和現實生活中繼承是類似的
如:兒子繼承父親財產、子女的生理特性有父母的特性(身高、膚色、性格等等....)
只是必定比例上是這樣的,不是絕對的同樣

JS中繼承方法有如下幾種本質區別方法(特別注意是本質區別)

  • 冒充繼承(也稱之爲借用構造函數)javascript

    這種方法實現原理主要是利用了call/apply
    // 定義父「類」(ES6以前JS中沒有嚴格意義上的「類」概念)
      function Parent(name, age) {
          this.name = name
          this.age = age
          this.run = function () {
              console.log('run...')
          }
      }
      // 定義子」類「
      Student.prototype.sid=200
      function Student(name, age, sex) {
          var _super = Parent
          // call方法強制更改this指向,注意這個方向只是單純的操做當前this對象,並不會影響到其「原型對象」
          _super.call(this, name, age)
          delete _super
          this.sex=sex
      }
      
      var student=new Student("zs",20,"Male")
      console.log(student.name) // zs
      console.log(student.sid) // 200
  • 原型鏈繼承java

    // 定義父「類」(ES6以前JS中沒有嚴格意義上的「類」概念)
      Parent.prototype.lastName='damon'
      function Parent() {
          this.lastName='pool'
      }
      // 定義子」類「
      // 子類的原型指向父類的一個實例對象
      Student.prototype=new Parent()
      function Student() {
      }
      
      var student=new Student()
      // 查找過程是怎麼樣的?
      /*
       一、首先會在對象student自身身上查找,
       二、若是找不到,則到原型上查找,那麼student的原型是誰?
          student.__proto__===Student.prototype
          而Student.prototype=new Student也就是原型如今指向的是父類的實例
       三、因此到父類的實例上去查找,若是找不到,再到父類實例的原型上查找
       四、若是找不到,則到原型的原型上查找,此時到了Object.prototype身上
          Object.prototype.__proto__===null
       五、若是找不到,則返回undefined
      */
      console.log(student.lastName) // damon
還沒有寫完整,待續...
相關文章
相關標籤/搜索