为什么Function.prototype不能修改?

Why Function.prototype cannot be modified ?

Function.prototype页面是这样写的:

Function objects inherit from Function.prototype. Function.prototype cannot be modified.

或者在 javascript 中没有 classes 但构造函数实际上是函数的继承和原型链 :

function AclassName(){
    return 2;
}

// AclassName ---> Function.prototype ---> Object.prototype ---> null

而且我认为总是可以扩展 class 原型,例如:

AclassName.prototype.color = "somevlue";

那我不能修改是什么意思?

JS 中的一切都有一个原型(即使它是 null)。因此,实际 function 的原型是 Function.prototype.

当您在您的示例中分配或修改 AclassName.prototype 时,您正在为 AclassName 个实例 设置原型。请注意,对象 x 的原型 x.prototype 不同。如果 x 用作构造函数,.prototype 用于设置将用于 x 的 实例 的原型。

换句话说:

你的函数 AClassName,用 function AClassName () {} 声明,是 class Function 的对象,所以它继承自 Function.prototype

如果你实例化 class:

var myInstance = new AClassName();

那么myInstance是classAClassName的对象,所以继承自AClassName.prototype.

所以回答你问题的根源:Function.prototype 不能被修改,因为它是语言的核心部分并且能够改变它可能会引入性能或安全问题。但是,您完全可以自由修改自己的 classes.

原型

我必须指出that:the函数的原型是Function.prototype,但是像foo这样的特定函数,它的原型不是Function.prototype

Function.prototype是一个可调用对象,它是一个"function" (typeof Function.prototype).foo.prototype是一个"object"。当你的 Function constructor 构造一个像 foo 这样的函数时,它运行一个代码:this.prototype={constructor:this} (This is from "The JavaScript: good parts", Douglas Crockford);即 foo.prototype={constructor:foo}.