JavaScript継承を実現する5つの方法

5724 ワード

1.プロトタイプチェーン継承
var Base = function() {
    this.level = 1;
    this.name = "base";
    this.toString = function(){
        return "base";
    };
};

var Sub = function() {
};
Sub.prototype = new Base();
Sub.prototype.name = "sub";
  • の利点:instance ofキーワードから見ると、例は親の例であり、またサブの例であり、最も純粋な継承のように見える.
  • 欠点:子供は親の属性と方法を区別し、Sub.prototype=new Base();このようなステートメントはその後それぞれ実行され、Subというコンストラクタに包装されません.例えば、Sub.prototype.name="sub"多重継承を達成できませんでした.
  • 2.構造継承
    var Base = function() {
    this.level = 1;
        this.name = "base";
        this.toString = function(){
            return "base";
        };
    };
    
    var Sub = function() {
        Base.call(this);
        this.name = "sub";
    };                  
  • 利点:複数の継承が可能であり、サブクラス特有の属性設定をコンストラクタの内部に置くことができる.
  • 欠点:instance ofを使用して、オブジェクトは親の例ではないことがわかった.
  • 3.インスタンス引継ぎ
    var Base = function() {
        this.level = 1;
        this.name = "base";
        this.toString = function(){
            return "base";
        };
    };
    
    var Sub = function() {
        var instance = new Base();
        instance.name = "sub";
        return instance;
    };
  • の利点:親類のオブジェクトであり、new構造オブジェクトを使用しても、new構造オブジェクトを使用しなくても、同じ効果が得られます.
  • 欠点:生成されたオブジェクトは実質的に親の例だけであり、サブクラスのオブジェクトではない.マルチ継承はサポートされていません.
  • 4.コピー引継ぎ
    var Base = function() {
        this.level = 1;
        this.name = "base";
        this.toString = function(){
            return "base";
        };
    };
    
    var Sub = function() {
        var base = new Base();
        for(var i in base)
            Sub.prototype[i] = base[i];
        Sub.prototype["name"] = "sub";
    };
  • 長所:多相続を支持する.
  • 欠点:効率が低い;親には数えられない方法があります.
  • 5.対象継承
    もし私達はクラスの継承が必要でないならば、対象の継承だけが必要で、ECMAScript 5をサポートするブラウザにとって、Object.create方法でも実現できます.
    var Base = function() {
        this.level = 1;
        this.name = "base";
        this.toString = function(){
            return "base";
        };
    };
    
    var sub = Object.create(new Base());
    sub.name = "sub";
  • オブジェクトは、Ext-5.0において、一般的に適用されています.広く採用されているのは、以前のnew演算子
  • の代わりに、Ext.creat(...)の形です.