.call()
それぞれ個別に指定したthis
値と引数によって、関数を呼び出します。
注意: この関数の文法はapply()とほぼ同じです。 根本的な違いは、call()が引数のリストを受け入れるのに対し、apply()は単一の引数の配列のみを受け取るところです。
文法
fun.call(thisArg[, arg1[, arg2[, ...]]])
引数 | 説明 |
---|---|
thisArg |
fun (関数)の呼び出しに提供されるthis 値を指定します。
このメソッドによって参照されるのは実際の値では無いかもしれないことに注意してください。
もし、メソッドが非strictモードのコード内の関数である場合、
null とundefined はグローバルオブジェクトに置き換えられ、
プリミティブ値はボックス化されます。
|
arg1, arg2, ... | 渡される引数を指定します。 |
説明
このメソッドにより、既存の関数を呼び出す際に、異なるthis
オブジェクトを割り当てることが可能になります。
通常、this
は、呼び出しをしたオブジェクト自体を参照します。
call
を使用すると、それを書くだけで、
新しいオブジェクトに対してそのメソッドを書き直す必要無く、
別のオブジェクトを引き継ぐことが可能になります。
例
callを使用したチェーンコンストラクタ
Javaのように、オブジェクトのチェーンコンストラクタにcall
を使用することが可能です。
下記の例では、Productオブジェクトのためのコンストラクタが2つのパラメーター
name
とprice
付きで定義されています。
他の2つの関数、FoodとToyはthis
とname
とprice
を渡すことでProductを実行します。
Productはname
とprice
のプロパティを初期化し、
用途に特化した2つの関数はcategory
を定義します。
function Product(name, price) {
this.name = name;
this.price = price;
if (price < 0)
throw RangeError('Cannot create product
"' + name + '" with a negative price');
return this;
}
function Food(name, price) {
Product.call(this, name, price);
this.category = 'food';
}
Food.prototype = Object.create(Product.prototype);
function Toy(name, price) {
Product.call(this, name, price);
this.category = 'toy';
}
Toy.prototype = Object.create(Product.prototype);
var cheese = new Food('feta', 5);
var fun = new Toy('robot', 40);
callを使用した匿名関数の実行
この例では、匿名関数を作成し、call
を使用して、
配列の各オブジェクト毎にその匿名関数を実行しています。
この例での匿名関数を使用する目的は、配列のオブジェクトの情報をコンソール出力することが出来るように、
各オブジェクトに対してprint
関数を追加することにあります。
厳密にはオブジェクトにthis
値を渡す必要はありませんが、
解説のためにこれを行っています。
//訳注)speciesは"種"を意味します
var animals = [
{species: 'Lion', name: 'King'},
{species: 'Whale', name: 'Fail'}
];
for (var i = 0; i < animals.length; i++) {
(function (i) {
this.print = function () {
console.log('#' + i + ' ' + this.species
+ ': ' + this.name);
}
this.print();
}).call(animals[i], i);
}
仕様
ブラウザ互換性
機能 | Chrome | Firefox (Gecko) |
IE | Opera | Safari |
---|---|---|---|---|---|
基本 | ◯ | ◯ | ◯ | ◯ | ◯ |
機能 | Android | Chrome for Android |
Firefox Mobile |
IE Mobile |
Opera Mobile |
Safari Mobile |
---|---|---|---|---|---|---|
基本 | ◯ | ◯ | ◯ | ◯ | ◯ | ◯ |
関連項目
© 2017 Mozilla Contributors
Licensed under the Creative Commons Attribution-ShareAlike License v2.5 or later.
このページは、ページトップのURL先のMozilla Developer Network(以下、MDN)のコンテンツを翻訳した内容を基に構成されています。 構成について異なる点も含まれますので、下記の項目を確認し、必要に応じて元のコンテンツをご確認ください。 もし、誤訳などの間違いを見つけましたら、 @tomofまで教えていただければ幸いです。
- 特定のブラウザに特化しすぎている情報やあまりにも古い情報、 または試験的に導入されているようなAPIや機能については、省略していることがあります。
- 例やデモについて、実際にページ内で動作させる関係で一部ソースコードを変更している場合や、 その例で使用しているコンテンツの単語や文章などを日本人向けに変更しいてる場合があります。
- MDNの更新頻度が高いため、元のコンテンツと比べ情報が古くなっている可能性があります。
- "訳注:"などの断わりを入れた上で、日本人向けの情報の追記を行っている事があります。