0
var function1 = function(){};
var function2 = function(){};

function1.call(function2.prototype);

私は上記のコードを理解しようと多くの時間を費やしてきました。function1上記の場合、どのようにfunction2変更されているかを誰かが説明できますか?

機能的なミックスイン

function1のオブジェクトでメソッドを呼び出すことができますfunction2。だから、私の結論はfunction変わったに違いない。

4

2 に答える 2

5

コード例を考えるとthis、その呼び出しのの値はオブジェクトfunction1の値に設定されます。function2.prototype

var function1 = function(){
    console.log(this === function2.prototype); // true
};
var function2 = function(){};


function1.call(function2.prototype);

したがって、上のメソッド(または他の値)は内部function2.prototypeからアクセスできます。thisfunction1

しかし、それらが単に次のように呼び出された場合:

this.someMethod();

thisその場合、メソッド内の値は実際のプロトタイプオブジェクトになります。これは珍しい使用法です。


リンクのコード例は次のようです。

var asCircle = function() {
  this.area = function() {
    return Math.PI * this.radius * this.radius;
  };
  this.grow = function() {
    this.radius++;
  };
  this.shrink = function() {
    this.radius--;
  };
  return this;
};

var Circle = function(radius) {
    this.radius = radius;
};
asCircle.call(Circle.prototype);

var circle1 = new Circle(5);
circle1.area(); //78.54

この例では、asCircle関数は値として提供されているものにメソッドを追加しthisます。したがって、基本的に、Circle.prototypeこの呼び出しの結果として、追加のメソッドで拡張されています。

ご覧のとおり、このメソッドは、その呼び出しによって割り当てられた後.area()のプロトタイプチェーンで使用できるようになります。Circle

つまり、呼び出されている関数がメソッドを使用しているのではなく、その逆です...新しいメソッドを提供しています。

于 2013-02-22T01:03:21.390 に答える
2

そうではありません。コードは、function2のプロトタイプをコンテキストとして使用してfunction1を呼び出しています。したがって、呼び出しでは、「this」はウィンドウオブジェクトではなく、function2のプロトタイプにマップされます(ブラウザから呼び出していると仮定します)

于 2013-02-22T01:03:11.673 に答える