3

JavaScriptで「拡張」がどのように機能するかを完全に理解しようとしています。

これは、Googleで見つけた簡単な拡張機能です

function extend(child, parent) {

    var f = function() {}
    f.prototype = parent.prototype;


    var i;

    for( i in parent.prototype ) {
        child.prototype[i] = parent.prototype[i];
    }


    child.prototype.constructor = child;
    child.parent = parent;

}

動作しますが、「child.prototype.constructor = child」の部分がわかりません。この機能は、それがなくても機能します。

ラインの目的は何ですか?

4

4 に答える 4

2

いいえ、どこで見つけましたか?2つのアプローチが混在しています。

古典的なプロトタイプの継承

function inherit(child, parent) {
    var f = function() {}
    f.prototype = parent.prototype;

    child.prototype = new f();
    child.prototype.constructor = child;
}

この関数は、parent関数のプロトタイプオブジェクトから直接継承する新しいオブジェクトを作成します。これは、の古いスタイルの同義語ですObject.create()。これで、プロトタイプチェーンが設定されます-すべてのインスタンスがchildから継承しparent.prototypeます。上書きするために新しいオブジェクトが生成されるためchild.prototype「constrcutor」プロパティを更新する必要があります

ミックスインの継承

この関数は、親のプロトタイプオブジェクトのすべてのプロパティをループし、それらを子のプロトタイプオブジェクトにコピーするだけです。これは、一般的なヘルパー関数extendが行うこととまったく同じです。子関数の「プロトタイプ」プロパティはリセットされませんが、継承チェーンも設定されません。

function extend(child, parent) {
    for (var i in parent.prototype ) {
        child.prototype[i] = parent.prototype[i];
    }
}

あなたは正しい、ライン

child.prototype.constructor = child;

ここではまったく役に立ちません。「コンストラクタ」プロパティは列挙できず、の影響を受けませんextend

また、関数は子関数オブジェクトの「親」プロパティを親関数に設定しますが、これは必須ではありません。

child.parent = parent;
于 2012-08-29T19:18:28.297 に答える
1

「child.prototype.constructor」はオブジェクトのベース/バニラ実装であり、同じ親を継承せずに他のオブジェクトを拡張できるように思われます。したがって、「child.parent = parent」の前に宣言されている理由です。

于 2012-08-29T17:39:10.207 に答える
1

これはあなたの質問に直接答えないかもしれませんがextend、John Resig の実装を使用することをお勧めします。

次のように、という名前のコンストラクターを作成できますinit

var MyClass = Class.extend({
    init: function() {
         console.log("Running a constructor");
    }
});

次のようにオブジェクトをインスタンス化します (通常):

var obj = new MyClass();
于 2012-08-29T18:34:37.697 に答える
0

この例は、javascript でクラスを継承する方法を示しています。

var a = function(){
    // class a constructor
    this.a_priviligiate_var = 1;
}
a.prototype.a_public_var = 2;
var b = function(){
    // class b constructor
    // super call of class a constructor
    // this line makes b class to inherit all privileged vars
    b.prototype.constructor.call(this)
    this.b_priviligiate_var = 3;
}
b.prototype.b_public_var = 4;
b.prototype = new a();
var c = new b();

クラスの定義:

var a = function(){
    // class a constructor
    this.a_priviligiate_var = 1;
}
a.prototype.a_public_var = 2;

別のクラスを定義する:

var b = function(){
    // class b constructor
    // super call of class a constructor
    // this line makes b class to inherit all privileged vars
    b.prototype.constructor.call(this)
    this.b_priviligiate_var = 3;
}
b.prototype.b_public_var = 4;

スーパー(親)クラスの設定。この行はすべての b.prototype をコピーします

b.prototype = new a();

c のインスタンスの作成

var c = new b();
于 2012-08-29T17:42:17.380 に答える