其中调用和应用函数是在javascript中定义的

其中调用和应用函数是在javascript中定义的,javascript,Javascript,有人能告诉我调用和应用函数是在java脚本中定义的吗。 最初我认为它们是在Function.prototype对象中定义的,这就是为什么所有函数都从那里继承它们的原因。但当我执行Function.prototype(在Crome控制台中)时,它会给我函数Empty(){} 有人能告诉我这些函数来自哪里,为什么function.prototype指向空方法吗 提前感谢。您看到了正确的行为,第15.4.3节规定: 函数原型对象是 本身是一个函数对象(其 [[Class]]是“函数”),当 调用,接受

有人能告诉我调用和应用函数是在java脚本中定义的吗。 最初我认为它们是在Function.prototype对象中定义的,这就是为什么所有函数都从那里继承它们的原因。但当我执行Function.prototype(在Crome控制台中)时,它会给我函数Empty(){}

有人能告诉我这些函数来自哪里,为什么function.prototype指向空方法吗


提前感谢。

您看到了正确的行为,第15.4.3节规定:

函数原型对象是 本身是一个函数对象(其 [[Class]]是“函数”),当 调用,接受任何参数和 返回未定义的

所有函数都是JS中的对象,尽管
函数。事实上,prototype
是一个函数本身,因此
call
apply
不能从该对象继承

如果您进一步阅读第15.4.3节,您将看到
apply
call
函数.prototype的成员

提示:默认情况下,Chrome以字符串形式输出函数(
Function.prototype.toString
)。您可以使用
console.dir
,强制它在对象树中显示所有属性:

console.dir(Function.prototype);

你看到了正确的行为,第15.4.3节规定:

函数原型对象是 本身是一个函数对象(其 [[Class]]是“函数”),当 调用,接受任何参数和 返回未定义的

所有函数都是JS中的对象,尽管
函数。事实上,prototype
是一个函数本身,因此
call
apply
不能从该对象继承

如果您进一步阅读第15.4.3节,您将看到
apply
call
函数.prototype的成员

提示:默认情况下,Chrome以字符串形式输出函数(
Function.prototype.toString
)。您可以使用
console.dir
,强制它在对象树中显示所有属性:

console.dir(Function.prototype);
试一试

您没有看到它们的原因是,内置对象属性/函数通常是不可枚举的<代码>对象。getOwnPropertyNames
是一个函数,用于列出对象的属性,而不考虑可枚举性。它也是EMCAScript5规范中最近添加的一款,但是Chrome应该可以很好地支持它。

试试看


您没有看到它们的原因是,内置对象属性/函数通常是不可枚举的<代码>对象。getOwnPropertyNames
是一个函数,用于列出对象的属性,而不考虑可枚举性。这也是EMCAScript 5规范附带的一个相对较新的补充,但Chrome应该可以很好地支持它。

以下是WebKit中来自JavaScriptCore(Nitro)的源代码

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));
}
EncodedJSValue JSC\u HOST\u调用函数protofuncapply(ExecState*exec){
JSValue thisValue=exec->hostThisValue();
CallData CallData;
CallType CallType=getCallData(此值为callData);
if(callType==CallTypeNone)返回throwVMTypeError(exec);
JSValue数组=exec->argument(1);
标记参数缓冲区应用程序;
如果(!array.isUndefinedOrNull()){
如果(!array.isObject())返回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)->继承(&JSArray::s_info)){
unsignedlength=asArray(array)->get(exec,exec->propertyNames().length).toUInt32(exec);
for(无符号i=0;iget(exec,i));
}否则返回throwVMTypeError(exec);
}
返回JSValue::encode(调用(exec,thisValue,callType,callData,exec->argument(0),applyArgs));
}

如果您愿意,您可以通过V8和JaegerMonkey源代码查找它们的实现。我自己找不到。如果有人想给我指出源代码或其他源代码,那很酷:)

这是WebKit中来自JavaScriptCore(Nitro)的源代码

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));
}
EncodedJSValue JSC\u HOST\u调用函数protofuncapply(ExecState*exec){
JSValue thisValue=exec->hostThisValue();
CallData CallData;
CallType CallType=getCallData(此值为callData);
if(callType==CallTypeNone)返回throwVMTypeError(exec);
JSValue数组=exec->argument(1);
标记参数缓冲区应用程序;
如果(!array.isUndefinedOrNull()){
如果(!array.isObject())返回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)->继承(&JSArray::s_info)){
unsignedlength=asArray(array)->get(exec,exec->propertyNames().length).toUInt32(exec);
for(无符号i=0;iget(exec,i));
}否则返回throwVMTypeError(exec);
}
返回JSValue::encode(调用(exec,thisValue,callType,callData,exec->argument(0),applyArgs));
}

如果您愿意,您可以通过V8和JaegerMonkey源代码查找它们的实现。我自己找不到。如果有人想向我指出源代码或其他源代码,那很酷:)

您应该执行
console.dir(Function.prototype)
并单击箭头列出其属性。您应该执行
console.dir(Function.prototype)
并单击箭头列出其属性。谢谢!!这很有帮助。但是当我反对的时候