0

これはいくつかのコードです

ob1 = {
 m: function(){
   alert(this);
   }
}

ob2.m = ob1.m;

これは、この場合、関数がメモリに一度格納されると思うためです

4

4 に答える 4

1

はい、そのコードでは、 と の両方が同じfunctionへの参照を持っていob1ます。を呼び出すと、 を参照して呼び出されます。を呼び出すと、 を参照して呼び出されます。関数のコピーは1 つだけで、その関数への複数の参照があります。JavaScript では、関数は他のオブジェクトと同様に実際のオブジェクトです。(これは、他の多くのプログラミング言語には当てはまりません。)ob2mob1.m()mthisob1obj2.m()mthisob2

これを行うこともできます:

function m() {
}

var ob1 = {m: m};
var ob2 = {m: m};

繰り返しますが、それらは機能を共有しています。

またはこれ:

function MyObject() {
}
MyObject.prototype.m = function() {
};

var ob1 = new MyObject();
var ob2 = new MyObject();

MyObject.prototypeを介して作成されたときに両方とも基本的なプロトタイプとして受け取り、プロトタイプには関数への参照があるため、再び関数を共有しnew MyObjectます。

同様に (ES5 対応環境で):

var MyProto = {
    m: function() {
    }
};

var ob1 = Object.create(MyProto);
var ob2 = Object.create(MyProto);

オブジェクトは再びプロトタイプを共有することになり、そのプロトタイプにはm機能があります。

于 2013-02-18T14:04:14.100 に答える
0

はい。関数はファーストクラスのオブジェクトです。それらへの参照と実際にやり取りするだけです。

于 2013-02-18T14:02:01.200 に答える