了解JavaScript中原型以及原型链只须要记住如下2点便可javascript
Number.__proto__ === Function.prototype // true Boolean.__proto__ === Function.prototype // true String.__proto__ === Function.prototype // true Object.__proto__ === Function.prototype // true Function.__proto__ === Function.prototype // true Array.__proto__ === Function.prototype // true RegExp.__proto__ === Function.prototype // true Error.__proto__ === Function.prototype // true Date.__proto__ === Function.prototype // true
可知全部的构造函数都继承于Function.prototype , 甚至包括根构造器Object及Function自身。全部构造器都继承了Function.prototype的属性及方法,如length、call、apply、bind等。java
既然全部的构造器都来自于Function.prototype, 那么Function.prototype 是什么呢?app
Object.prototype.toString.call(Function.prototype) "[object Function]" Function.prototype(); //undefined
Function.prototype 是函数,是否是很意外!!!函数
既然 Function.prototype 是函数,那么它就是 Function 的实例,然而并非这样的!!!spa
Function.prototype.__proto__ === Function.prototype // false Function.prototype.__proto__ === Object.prototype // true
如何理解 Function.prototype 不是 Function 实例的怪异行为呢?解决怪异行为的根本方法是让它显得不那么怪异,看下面代码。prototype
Object.prototype.toString.call(Number.prototype) "[object Number]" Number.prototype.__proto__ === Number.prototype // false Number.prototype.__proto__ === Object.prototype // true Object.prototype.toString.call(String.prototype) "[object String]" String.prototype.__proto__ === String.prototype // false String.prototype.__proto__ === Object.prototype // true Object.prototype.toString.call(Array.prototype) "[object Array]" Number.prototype.__proto__ === Array.prototype // false Number.prototype.__proto__ === Object.prototype // true
简单理解:内置构造函数的数据类型是对应的构造函数,但不是其对应构造函数的实例,而是Object的实例。code
构造函数\函数都有prototype属性,指向构造函数函数的原型,原型有constructor属性,指向构造函数\函数对象
Number.prototype.constructor === Number // true Function.prototype.constructor === Function //true Object.prototype.constructor === Object true
function wang(){}; wang.prototype.constructor === wang //true