定义一个函数,函数的原型到底是什么?

foo的原型是什么 控制器输出的代表什么意思?

图片描述

阅读 4.9k
2 个回答

1.控制台打印出来的{constructor:f}是foo的prototype属性,这个属性是一个对象,对象里面可以有很多方法或者属性,但是因为你自己定义的foo没有在foo.prototype上添加属性或者方法,所以打印出来的的foo.prototype只有constructor属性,这是一个自动存在的属性,指向原函数,所以可以看到“{constructor:f}”,意思就是constructor属性指向foo函数。

foo.prototype.constructor==foo; //true

2.你定义foo是一个普通函数,没有继承于某个函数,所以它的原型就是根据原型链往上走的话,是Function.prototype。从你的表达上面可以看出你没有分清楚原型和原型链的区别,foo.prototype并不能获取到foo的原型,应该用foo_proto_,或者object.getPrototypeOf(foo)来获取,prototype只是函数的一个特殊属性,它指向了new 这个函数创造出来的对象的原型对象,但并不是原型,这里很容易混淆。

function foo(){
}
foo.getPrototypeOf(aa);          //function () { [native code] }
foo._proto_==Function.prototype;   //true
Object.getPrototypeOf(aa)==Function.prototype;    //true

另外给你推荐一篇论坛里写的关于原型和原型链的帖子,应该对你有帮助白话原型和原型链

首先我们创造的每个函数都会有一个 prototype(原型) 属性,该属性所指向的对象即我们所说的原型(对象)。而所有原型都有一个 constructor(构造函数) 属性,该属性指向我们所创造的函数。
当你把 foo.prototype 在控制台打印的时候,如果你把打印的内容展开,你应该可以看到两个属性:constructor 和 proto__(如果你是在chrome 或者 FF下)。这里的 constructor 就是之前说的构造函数属性,而 __proto 则是每个对象都会有的一个属性,是 js 内部用来查找原型链的属性

推荐问题
宣传栏