高阶程序为啥说每个函数都包含两个非继承而来的方法:apply()和call().?

你有一个拼写错误,请注意查收。Object.getOwnPropertyNames(Function.prototype);// 关于 Function.prototype ,见 specECMAScript? 2017 Language Specification关于 function 与 Function ,见《JS高级程序设计(第三部)》
■网友
谢邀。追究倒底是Function还是某个function,并没什么意义,因为Function本身也是一个function高阶程序为啥说每个函数都包含两个非继承而来的方法:apply()和call().?

追究倒底是不是继承来的也没什么意义,js中的对象本来就都是基于原型继承的,call、apply就在Function的原型上,难道不能说是继承来的么?这就好比你身上的某种基因倒底是来自哪个祖先的问题一样,你现在并不需要知道,你只要知道它来自你的祖先,你拥有它,对目前来说就够了,等你成为遗传说家的时候,再去研究来自哪一个祖先也不迟。
■网友
昨天正好也在研究这个问题,还是 @鲁小夫 给我解答的呢。谢谢小夫君。也是新手,个人的狭隘见解。1. 构造函数在生成实例时会将自己的属性和值赋给实例对象。其中就包括了prototype属性。也就是说,实例和构造函数的prototype都指向了同一个对象,区分二者的原型并无意义。(此处错误!)只有函数才有prototype属性,而用构造函数创建的是一个实例对象,不具有prototype属性,只有_proto_, 才等于构造函数的prototype。(评论区谢谢小夫君和深红的指点)2. 非继承,意即直接从构造函数处获得,而不是顺着原型链往上翻。所以,这个问题的结论很明显,Function的prototype具有这两个函数,而Function本身不具有,他的实例当然也就不会具有,但是却可以顺着原型链找到这两个方法。所以就有了“每个函数都具有两个非继承而来的apply、call方法”(实际上还有个bind)。
■网友
这里的非继承,可能指的是通过原型链继承而不是构造函数直接继承。
■网友
原文是:

There are two additional methods for functions: apply() and call(). These methods both call the function with a specifi c this value, effectively setting the value of the this object inside the function body.
【高阶程序为啥说每个函数都包含两个非继承而来的方法:apply()和call().?】


    推荐阅读