在javascrpit中每一个函数中都有一个prototype属性,在其建立的时候,不管是用var method = function(){}或者 var method = new Function()或者function method(){}三种方法中哪种方法去建立这个变量,其中都会自带有prototype属性。prototype属性是一个对象,其中默认会含有constructor属性。该属性是指向函数自己的一个指针。java
向上面定义的method方法,若是该方法时一个构造函数,那个用该构造函数建立的新的对象:如 var m = new method();(通常构造函数首字母为大写以示区分,这里忽略)。那么该m中有一个指向原型的指针[_proto_],这个指针直接是访问不到的,须要经过Object.getPrototypeOf()方法去访问,亦或经过m.constructor.prototype去访问。app
好比在method.prototype中定义一个方法,method.prototype.sayHello = function(){alert("hello");};。那么新对象m中也能够直接调用这个方法。m.sayHello();这时候会弹出警告框hello。每一个对象中属性查询的顺序是先查找对象自己中有没有该属性,若是没有,就会查找该对象的原型,原型的原型,直至最顶层的Object或者找到该属性为止,若是没找到则会返回undefined。这里就能够理解上面经过m.constructor.prototype去访问本身构造函数prototype的原理了。m自己中是没有constructor这个构造函数指针的,因此会去查找m的[_proto_]所指向的原型中有没有constructor。有由于m的[_proto_]是指向method.prototype,那么确定包含constructor指针指向method自己,而prototype又是method中的属性,因此绕几个弯之后就能够访问到[_proto_]所指向的原型对象了。函数
这里值得注意的是若是一个对象是Function类型的,那么自己包含的prototype和[_proto_]是彻底不一样的两个概念。仍是按照上面举的例子来讲,关于这个method对象,若是是method.constructor,那么指向的就是Function,若是是method.prototype.constructor ,那么指向的就是method自己。method.constructor.prototype = Function.prototype 。因此说method.prototype.constructor和method.constructor.prototype是彻底不一样的两个概念,虽然只是顺序不一样。这里Function.prototype仍是一个function类型的对象,其中咱们经常使用的arguments,call,apply,caller这些都是在这个function对象里面所定义的。prototype