コンストラクション関数継承とclass継承

4606 ワード

コンストラクタ継承


1、サブクラスはapplyメソッドまたはcallメソッドでthisを親に向ける
jsコード
        function Parent(name, age) {
            this.name = name
            this.age = age
        }
        Parent.prototype.init = function(){
            console.log(this.name, this.age) 
        }
        function Son(name, age) {
            Parent.apply(this, [name, age]) // apply call this 
        }

このメソッドは親のプロパティを継承しますが、親プロトタイプのメソッドは継承されません.
2、親インスタンスオブジェクトを子プロトタイプに割り当てる
jsコード
        function Parent(name, age) {
            this.name = name
            this.age = age
        }
        Parent.prototype.init = function(){
            console.log(this.name, this.age) 
        }
        function Son(name, age) {
            
        }
        Son.prototype = new Parent() // 
        Son.prototype.constructor = Son //

これは親プロトタイプメソッドを継承しますが、親プロパティは継承されません.
1,2の両者を統合すると構造関数の組合せが継承され,親を継承する方法と属性が実現される.
jsコード
        function Parent(name, age) {
            this.name = name
            this.age = age
        }
        Parent.prototype.init = function(){
            console.log(this.name, this.age) 
        }
        function Son(name, age) {
            Parent.call(this,name,age) // apply call this 
        }
        Son.prototype = new Parent() // 
        Son.prototype.constructor = Son //

コンビネーション継承コンビネーション継承:継承の実装中に親インスタンスが2回呼び出されたという欠点

class継承


1.extendsキーワードで親プロトタイプメソッドを継承し、superメソッドで親プロパティを継承し、
jsコード
        class Parent{
            constructor(name,age) {
                this.name = name
                this.age = age
            }
            init(){
                console.log(this.name,this.age)
            }
        }
        class Son extends Parent{ //extends 
            constructor(name,age) {
               super(name,age) //super 
            }
        }
        new Son(' ',18).init()