为什么不能修改Function.prototype?

时间:2016-01-20 10:42:08

标签: javascript prototypal-inheritance

Function.prototype页面中写道:

  

函数对象继承自Function.prototype。 Function.prototype的   无法修改。

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

function AclassName(){
    return 2;
}

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

我认为总是可以扩展类原型,如:

AclassName.prototype.color = "somevlue";

那么我无法修改是什么意思?

2 个答案:

答案 0 :(得分:0)

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

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

换句话说:

使用function AClassName () {}声明的函数AClassName是类函数的对象,因此它继承自Function.prototype

如果您实例化该类:

var myInstance = new AClassName();

然后myInstance AClassName 类的对象,因此它继承自AClassName.prototype

因此,要回答问题的根源:Function.prototype无法修改,因为它是语言的核心部分,并且能够更改它可能会引入性能或安全问题。但是,您可以完全自由地修改自己类的原型。

答案 1 :(得分:0)

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

Function.prototype是一个可调用的对象,它是一个“函数”(typeof Function.prototype).foo.prototype是一个“对象”。当Function构造函数构造一个像foo这样的函数时,它会运行一个代码:this.prototype={constructor:this}(这来自“The JavaScript:good parts”,Douglas Crockford);即foo.prototype={constructor:foo}