3

次のコードは、MDN ページの から取得したものですFunction.prototype.apply

Function.prototype.construct = function (aArgs) {
    var fConstructor = this,
        fNewConstr = function () { fConstructor.apply(this, aArgs); };
    fNewConstr.prototype = fConstructor.prototype;
    return new fNewConstr();
};

function MyConstructor() {
    for (var nProp = 0; nProp < arguments.length; nProp++) {
        this["property" + nProp] = arguments[nProp];
    }
}

var myArray = [4, "Hello world!", false];
var myInstance = MyConstructor.construct(myArray);
alert(myInstance.property1); // alerts "Hello world!"
alert(myInstance instanceof MyConstructor); // alerts "true"
alert(myInstance.constructor); // alerts "MyConstructor"

このコードについて 2 つの質問があります。

  1. var myInstance = new MyConstructor();使用すると が呼び出されることはわかってMyConstructor()いますが、どのようにvar myInstance = MyConstructor.construct(myArray);呼び出すのMyConstructor()ですか?

  2. MyConstructor.construct(myArray);のメソッドとして呼び出されましたが、そのメソッドはではなくMyConstructorとして宣言されました。とはどう違いますか?Function.prototype.constructMyConstructor.prototype.constructFunction.prototype.constructMyConstructor.prototype.construct

4

4 に答える 4

2

あなたの両方の質問に対する答えは、呼び出し方に基づいてthis内部が設定されているということです。construct()

と書くFunction.prototype.construct()と、thisになりFunction.prototype、壊れます。

と書くMyConstructor.construct()と、thisisMyConstructorになるので、コードは動作します。


補足として、このコードは、サポートしているブラウザーで大幅に簡素化できます。

Function.prototype.construct = function (args) {
    return new (this.bind.apply(this, [null].concat(args)))();
};
于 2013-06-14T02:27:25.853 に答える
2

でアクセスしたため、これconstructですべてのメソッドが作成されました。は、実際にはすべての を参照している に割り当てられているため、誤解を招く変数です。オブジェクトのプロパティであるメソッド内では、メソッドが属するオブジェクトを実際に参照します。every を参照する必要があります。この場合、それは実際には への参照を保持する変数であり、後で でプロトタイプの一部になり、後で で実行されます。が呼び出されると、 、またはすべての引数の配列を渡すために使用されます。したがって、配列をに渡します。FunctionFunction.prototypefConstructorthisFunctionthisfNewConstrthis.fNewConstrFunctionFunctionFunctionfNewConstr.prototype = fConstructor.prototypenew fNewConstr()new fNewConstr()apply()fConstructorFunctionMyConstrutor

于 2013-06-14T02:56:11.203 に答える
1

最初の質問について:

MyConstructor一連の間接参照を通じて呼び出され、引数リストとして配列が渡されます。がMyConstructor.construct(myArray)呼び出されると、this内部constructは になりますMyConstructor。それへの参照は として保存されfConstructor、子コンストラクターfNewConstrが作成されます。そのコンストラクターは、からの要素を引数として渡して、でMyConstructor呼び出します。applymyArray

余談ですが、これは説明が複雑すぎるように思えますFunction.prototype.apply(MDN は、Java を模倣するためのものだと言っているので、それで説明できるかもしれません)。

2番目の質問について:

constructを追加すると、 を含むFunction.prototypeすべての関数オブジェクト ( のインスタンス) で使用できるようになります。に追加すると のすべてのインスタンスに影響し、 に追加するとすべての関数オブジェクトを拡張します。FunctionMyConstructorMyConstructor.prototypeMyConstructorFunction.prototype

于 2013-06-14T02:55:07.660 に答える