先端面接問題——JavaScriptアナログ引き継ぎ

3992 ワード

先の面接問題シリーズ―― JavaScriptアナログタイプ引継ぎ
 
クラス継承のニーズ
 
SuperClassは父類で、SubClassはサブクラスです.達成したい効果は、サブクラスが親クラスの共有の属性と方法を継承することであり、方法は依然としてサブクラスの共有であり、サブクラスが親クラスの実例となる属性と方法を継承し、属性はサブクラスのそれぞれのインスタンスが自分のものである.くりを一つあげる:
 
    function SuperClass( name ) {
        this.name = name;
    }

    SuperClass.prototype.sayName = function () {
        alert ( this.name );
    }

    function SubClass() {}

    inheritClass( SubClass, SuperClass );// inheritClass             

    var sub1 = new SubClass( 'jack' );

    var sub2 = new SubClass( 'king' );

    alert( sub1.name == 'jack' );//     true

    alert( sub2.name == 'king' );//    true
    
    sub1.sayName(); //   alert( 'jack' )

 
 
  inherit Classはどうやって実現しますか?まず原型チェーンを継承します.
 
 
    function SuperClass( name ) {
        this.name = name;
    }

    SuperClass.prototype.sayName = function () {
        return this.name;
    }

    function SubClass() {}

    SubClass.prototype = new SuperClass();//      

    var sub1 = new SubClass( 'jack' );

    var sub2 = new SubClass( 'king' );

    alert( sub1.name == 'jack' );//     flase;
    alert( sub1.name ); //'jack'

    alert( sub2.name == 'king' );//    true;

    sub1.sayName(); //alert(' jack' );
 
nameは各インスタンスの自分のものではなく、実際にはサブクラスが共有しています.SubClass.prototyp.nameで得られたものは、どのように改善されますか?
 
    function SuperClass( name ) {
        this.name = name;
    }

    SuperClass.prototype.sayName = function () {
        return this.name;
    }

    function SubClass() {
        SuperClass.apply( this, arguments );  
    }

    SubClass.prototype = new SuperClass();//      

    var sub1 = new SubClass( 'jack' );

    var sub2 = new SubClass( 'king' );

    alert( sub1.name == 'jack' );// true;

    alert( sub2.name == 'king' );//true;

    sub1.sayName(); //alert(' jack' );
 
私たちはappyを利用してこの機能を実現しましたが、SuperClass.prototyp.nameは依然として存在しています.属性が多いと大きな浪費です.どうやって改善を続けますか?問題はSubClass.prototype=new SuperClass()です.この文では、ここでは共有の方法と属性継承の動作のみを実行する必要があります.このタスクを完了するためにコンストラクタを借りることができます.
 
    function SuperClass( name ) {
        this.name = name;
    }

    SuperClass.prototype.sayName = function () {
        return this.name;
    }

    function SubClass() {
        SuperClass.apply(this, arguments);
    }

    function prototypeInherit( o ) {
        function F(){};
        F.prototype = o;
        return new F();
    }

    function inheritClass( SubClass, SuperClass ) {
        var prototype = prototypeInherit( SuperClass.prototype );
        prototype.constructor = SubClass;
        SubClass.prototype = prototype;
    }

    inheritClass( SubClass, SuperClass );// inheritClass             

    var sub1 = new SubClass( 'jack' );

    var sub2 = new SubClass( 'king' );

    alert( sub1.name == 'jack' );//true

    alert( sub2.name == 'king' );//true

    alert( sub1.sayName() );//'jack'

    alert( sub1.constructor.name );
 
次の2つの関数を分析します.inheit Classの核心はSubClass.prototype:prototypeInheit(o)を構築するために、公営の構造関数Fを利用して、インスタンスの属性と方法がサブクラスのprototypeに伝わらないようにします.inherst Class(SubClass、SuperClass)は、ProttypeのconstructorをSubClassに修正する必要があります.以前はSuper Classです.小宿題:前はなぜスーパークラスだったか考えてみます.