あなたが自分でそう言うように:あなたは関数オブジェクトを持っています。関数は、オブジェクトリテラル、配列、またはその他のものと同じように、JSのオブジェクトです。関数には、プロパティとメソッドを自由に割り当てることができます。
var someAnonFunction = function(foo)
{
console.log(this);
console.log(this === someAnonFunction);//will be false most of the time
};
someAnonFunction.x = 123;//assign property
someAnonFunction.y = 312;
someAnonFunction.divide = function()
{
console.log(this === someAnonFunction);//will be true most of the time
return this.x/this.y;//divide properties x & y
};
someAnonFunction.divide();
この場合、によって参照される関数オブジェクトにはsomeAnonFunction
、呼び出される無名関数への参照が割り当てられていますdivide
(無名関数への参照はとにかくdivideと呼ばれていました)。したがって、ここにはプロトタイプの関与はまったくありません。自分で言うように、気をつけてください。すべてのオブジェクトはさかのぼることができます。Object.prototype
これを試してみてください。
console.log(someAnonFunction.toString === Function.prototype.toString);//functions are stringified differently than object literals
console.log(someAnonFunction.hasOwnProperty === Object.prototype.hasOwnProperty);//true
または、おそらくこれはより明確です:メソッド/プロパティ呼び出しがJSの値に解決される方法の単純なスキーム:
[ F.divide ]<=========================================================\ \
F[divide] ===> JS checks instance for property divide | |
/\ || | |
|| || --> property found @instance, return value-------------------------------| |
|| || | |
|| ===========> Function.prototype.divide could not be found, check prototype | |
|| || | |
|| ||--> property found @Function.prototype, return-----------------------| |
|| || | |
|| ==========> Object.prototype.divide: not found check prototype? | |
|| || | |
|| ||--> property found @Object.prototype, return---------------------|_|
|| || |=|
|| =======>prototype is null, return "undefined.divide"~~~~~~~~~~~~~~~|X|
|| \ /
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~< TypeError can't read property 'x' of undefined
したがって、上記のコードをプロトタイプを使用して機能させる場合は、ある種のプロトタイプ(この場合はFunction.prototype
)を拡張する必要があります。これは推奨されるべきではないことを知っておいてください。実際、「ネイティブ」プロトタイプの変更はしばしば眉をひそめます。まだ:
Function.prototype.divide = function (a, b)
{
a = +(a || 0);//coerce to number, use default value
b = +(b || 1) || 1;//division by zeroe is not allowed, default to 1
return a/b;
};
function someFunction ()
{
return 'someString';
};
var another = function(a, b)
{
return a + b;
};
someFunction.divide(12, 6);//will return 2
another.divide(12, 4);//3
someFunction
どちらの場合も、名前(または)で参照される関数オブジェクトは、見つからないという名前another
のプロパティをスキャンされます。次に、そのようなプロパティが見つかったdivide
をスキャンします。
そうでない場合、JSはチェックも行います。それが失敗した場合、最終的にエラーがスローされます。Function.prototype
Object.prototype
私はしばらく前にこの主題に関するSOについてかなり長い回答を投稿しました:
my.class.jsがこれほど高速になる理由は何ですか?(プロトタイプチェーンを扱う)
javascriptのオブジェクトと関数(関数の要約<=>オブジェクト<=>コンストラクター)
JavaScriptの「クラス」定義のこれら3つのパターンの違いは何ですか?(まだ少し情報があります)
Javascript-関数の内容を動的に変更します(無名関数に漠然と触れ、変数とプロパティに割り当てられ、それらのコンテキストを変更します)