首頁 >web前端 >js教程 >ES5實例詳解javascript多種繼承方式

ES5實例詳解javascript多種繼承方式

小云云
小云云原創
2018-02-03 14:31:071601瀏覽

javascript作為一門輕量級的腳本語言在ES6和node.js的橫空出世之後將其推向的新的高度,雖然ES6 中出現的新的生成對象的類語法格式,但依然為ES5的語法糖,而我們依然有必要從javascript的原生實現入手來了解它的繼承實現方式,ES6給出了更加簡潔的固定的類聲明方式。

javascript的繼承不同的開發者有不同的理解方式,筆者認為主要分為四種

 - 原型链继承
 - 对象冒充继承(构造函数继承 不过我不喜欢这个名字)
 - 组合继承
 - 寄生组合继承

對於繼承,可以預先聲明一個Animal, 進而討論不同的繼承方式.
    let Animal = (function () {
      function Animal (name) {
        this.name = name || 'Animal';
        this.sleep = function(){
          console.log(this.name + '正在睡觉!');
        }
      }
      Animal.prototype.eat = function(food) {
        console.log(this.name + '正在吃:' + food);
      }
      return Animal;
    })()
  1. 原型鏈繼承

        let Cat = (function () {
          function Cat(){ 
          }
          Cat.prototype = new Animal();
          Cat.prototype.name = 'cat';
          return Cat;
        })()
    原型链是 javascript 的典型继承方式, 这种继承方式的最大特点就是共享,所有事例共享原型对象中的所有属性和方法, 共享是它的最大优点 也是它的最大缺点, 正对我们的不同需求, 比如大多数情况下我们常常需要某些属性是子类特有的  而一些读取属性方法需要共享,--另外此种继承无法向父类传参,无法实现多继承
  2. 物件冒充繼承

        let Cat = (function () {
          function Cat(name){
            Animal.call(this,name);
          }
          return Cat;
        })()
    对象冒充继承就是简单的利用call或者apply方法实现继承,这种继承最大的特点正好与原型链继承相反不能继承原型属性/方法--非共享(子类自有一份), 同样这是它的优点也是它的缺点, 另外它解决了原型链继承中无法向父类传参的缺点, 并且可以实现某种意义上的多继承--(注意这种多继承是打引号的)
  3. #組合繼承

        let Cat = (function () {
          function Cat(name){
            Animal.call(this, name);
          }
          Cat.prototype = new Animal();
          Cat.prototype.constructor = Cat;
          return Cat;
        })()
    组合继承是比较好的继承, 他是原型链继承和对象冒充继承的合体, 合理的利用了这两种组合的特点(是特点不是优点^_^),既是子类的实例,也是父类的实例, 但有一个缺点就是调用了两次父类构造函数,生成了两份实例(子类实例将子类原型上的那份屏蔽了)造成内存浪费. 这也是用的最多的一种
  4. 寄生組合繼承

        let Cat = (function () {
          function Cat(name){
            Animal.call(this, name);
          }
          (function(sub, sup){
            var Super = function(){};
            Super.prototype = sup.prototype;
            sub.prototype = new Super();
            sub.prototype.constructor = sub
          })(Cat, Animal)
          return Cat;
        })()
#寄生組合繼承是對組合繼承的基礎上的昇華, 個人認為是堪稱完美的繼承方式,改進的組合繼承記憶體浪費的問題^_^

相關推薦:

為什麼需要利用javascript實現繼承?幾個繼承方式實例詳解

javascript原型鏈繼承方式用法與缺點實例詳解

js中的三種繼承方式與優缺點

以上是ES5實例詳解javascript多種繼承方式的詳細內容。更多資訊請關注PHP中文網其他相關文章!

陳述:
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn