理解关于Function的原型链问题
- 关于Function的原型链问题的一些个人粗略理解,欢迎指正错误的地方
- 可以看这篇文章:https://github.com/KieSun/Blo...
要理解Function的原型链的问题
首先深入理解__proto__
__proto__
的含义是 实例对象指向实例原型!!
实例的原型对象就是构造函数.prototype
例如
function Person() {
}
var person = new Person();
console.log(person.__proto__ === Person.prototype); // true
所以:
- 每一个JavaScript对象(除了 null )都具有的一个属性,叫
__proto__
,这个属性会指向该对象的原型(对象)。 - 每个函数都有一个
prototype
属性,构造函数指向实例原型,如下图
重点理解: 实例对象.__proto__指向实例原型对象
参考原博客__proto__的那个部分
挖来下图
理解之后我们来看 Function
1
在声明函数的时候
有一种声明方法是Function 构造函数
下面参考阮一峰
第三种声明函数的方式是Function
构造函数。
var add = new Function(
'x',
'y',
'return x + y'
);
// 等同于
function add(x, y) {
return x + y;
}
也就是说Function
是一个构造函数,用来生成函数的构造函数.那么,String()
,Boolean()
,Number()
这些函数都是Function
构造出来的,new
出来的,也就是说String()
,Boolean()
,Number()
这些函数(函数也是广义对象)是Function
的实例对象.那么 实例对象.__proto__指向实例原型对象
也就是说
String.__proto__===Function.prototype//true
Number.__proto__===Function.prototype//true
Boolean.__proto__===Function.prototype//true
Object.__proto__ === Function.prototype//true
不只是上述构造函数,实际上,任意函数的__proto__都===Function.prototype
即
所有函数.__proto__===Function.Prototype
因为任意函数都是Function()
new
(构造)出来的.
任意函数都是Function()
构造函数的实例
关于Function
最奇特 的是
Function.__proto__===Function.Prototype//true
因为 所有函数实例.__proto__就是Function构造函数的原型(Function.Prototype)
,函数而函数实例也包括他自己.
深入理解:
-
Function
作为一个函数对象实例,他有__proto__
,指向原型 -
Function
又作为一个构造函数,他有自己的protoype
,指向原型
所以
而
Function.__proto__===Object.Protoype//false
也就是说
更深层次的理解:
- Function优先是一个函数实例
- 自身是构造函数,自身又是自身构造函数的实例
- 其次才是广义的对象.
2Function
也可以看作是String()
或者Boolean()
或Number()
同等地位
因为所有函数.prototype
虽然是实例原型,但是实例原型本质还是一个对象,也就是说所有的实例原型对象是Object()
构造函数的实例,即
String.prototype.__proto__=== Object.prototype//true
Number.prototype.__proto__=== Object.prototype//true
Boolean.prototype.__proto__=== Object.prototype//true
//同理
Function.prototype.__proto__=== Object.prototype//true
Function
总结:
- 如果把函数看成对象,那么
函数.__proto__ === Function.prototype
- 如果把
Function
看成对象,那么Function.__proto__ === Function.prototype
最终总结
实例对象.__proto__===构造函数.prototype
其中实例对象是构造函数构造的实例.
原型链:
每层的__proto__
都指向上一层的原型,所以一层一层的__proto__
组成的链就成为原型链.
最终
Object.prototype.__proto__
//null
**粗体** _斜体_ [链接](http://example.com) `代码` - 列表 > 引用
。你还可以使用@
来通知其他用户。