2011-04-11 8 views
1

Javaスクリプトで呼び出し関数と適用関数が定義されている場所を教えてください。 最初は私がFunction.prototypeオブジェクトで定義されていると思っています。なぜなら、すべての関数がそこから継承しているからです。しかし、Function.prototype(Cromeコンソール)を実行するとEmpty(){}が返されます。呼び出し関数と適用関数がjavascriptで定義されています

誰かが私にこれらの機能の由来と、Function.prototypeが空のメソッドを指している理由を教えてください。

ありがとうございます。

+0

'console.dir(Function.prototype)'を実行し、矢印をクリックしてそのプロパティを表示してください。 –

答えて

1

正しい動作が表示されています。 The specification、セクション15.4.3は、言う:

関数プロトタイプオブジェクトが 自体Functionオブジェクトである を呼び出すこと(その [[クラス]が "関数" である)、任意の引数と リターンを受け付け未定義。

すべての機能は、JS内のオブジェクトであり、Function.prototypeですが、実際には、関数自体はcallapplyは、このオブジェクトから継承することができないという理由にはなりません。

15.4.3項をさらに読むと、applycallFunction.prototypeのメンバーであることがわかります。

ヒント:デフォルトでは、関数は文字列(Function.prototype.toString)として出力されます。あなたはconsole.dirを使用することによって、それはラオブジェクトツリーの特性Aのすべてを表示することを強制することができます。

console.dir(Function.prototype); 
+0

ありがとうAndy that helps.But私はObject.prototypeまたはNumber.prototypeをcromeで実行すると、プロパティがすぐに表示されます.ObjectおよびNumberもコンストラクタです。つまり、関数Objectです。 ? –

+0

チェーンはどこかで始まらなければなりません! Objectは関数なので、内部[[prototype]]はFunction.prototypeであり、その公開プロトタイプはObject.prototypeであり、[[prototype]]はnullです。それがチェーンの終わりです。 ECMA-262§15.2をお読みください。 – RobG

+0

@Gopal: 'Object'と' Number'は関数ですが、 'Object.prototype'と' Number.prototype'はオブジェクトです。 '関数。プロトタイプ '*は関数なのですが、どうして私はそれについて議論を見つけることができないのか分かりませんが、それは仕様にあるのです。 –

0

組み込みオブジェクトのプロパティ/関数があるので、あなたがそれらを見ていない理由がある

Object.getOwnPropertyNames(Function.prototype); 
//["bind", "arguments", "toString", "length", "call", "name", "apply", "caller", "constructor"] 

をお試しください多くの場合、は、列挙型ではないです。 Object.getOwnPropertyNamesは、列挙可能性に関係なくオブジェクトのプロパティを一覧表示するように設計された関数です。それはまた、EMCAScript 5仕様に付属する比較的最近の追加ですが、Chromeはそれをうまくサポートするはずです。

+0

ありがとう!!しかし、私はObject.prototypeまたはNumber.prototypeをcromeで実行すると、すぐにプロパティを表示します.ObjectおよびNumberもコンストラクタです。つまり、Functionの場合はこの特殊な動作です。 ? –

0

ここJavaScriptCoreにおける(ニトロ)からFunction.prototype.applyのソースコードは、あなたがしたい場合は、その実装を見つけるために、V8とJaegerMonkeyソースから狩りをすることができますWebKitの

EncodedJSValue JSC_HOST_CALL functionProtoFuncApply(ExecState * exec) { 
    JSValue thisValue = exec - > hostThisValue(); 
    CallData callData; 
    CallType callType = getCallData(thisValue, callData); 
    if (callType == CallTypeNone) return throwVMTypeError(exec); 

    JSValue array = exec - > argument(1); 

    MarkedArgumentBuffer applyArgs; 
    if (!array.isUndefinedOrNull()) { 
     if (!array.isObject()) return throwVMTypeError(exec); 
     if (asObject(array) - > classInfo() == & Arguments::s_info) asArguments(array) - > fillArgList(exec, applyArgs); 
     else if (isJSArray(& exec - > globalData(), array)) asArray(array) - > fillArgList(exec, applyArgs); 
     else if (asObject(array) - > inherits(& JSArray::s_info)) { 
      unsigned length = asArray(array) - > get(exec, exec - > propertyNames().length).toUInt32(exec); 
      for (unsigned i = 0; i < length; ++i) 
      applyArgs.append(asArray(array) - > get(exec, i)); 
     } else return throwVMTypeError(exec); 
    } 

    return JSValue::encode(call(exec, thisValue, callType, callData, exec - > argument(0), applyArgs)); 
} 

にあります。私は自分で見つけることができませんでした。誰かが私をソースに向かわせたいなら、それは涼しいです:)

関連する問題