在javascrpit中每个函数中都有一个prototype属性,在其创建的时候,无论是用var method = function(){}或者 var method = new Function()或者function method(){}三种方法中哪一种方法去创建这个变量,其中都会自带有prototype属性。prototype属性是一个对象,其中默认会含有constructor属性。该属性是指向函数本身的一个指针。

  向上面定义的method方法,如果该方法时一个构造函数,那个用该构造函数创建的新的对象:如 var m = new method();(一般构造函数首字母为大写以示区分,这里忽略)。那么该m中有一个指向原型的指针[_proto_],这个指针直接是访问不到的,需要通过Object.getPrototypeOf()方法去访问,亦或通过m.constructor.prototype去访问。

  比如在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对象里面所定义的。

最新文章

  1. 使用命令 gradle uploadArchives 的异常: Unable to initialize POM pom-default.xml: Failed to validate POM for project
  2. 使用JavaMail实现发送邮件功能
  3. Python-2 print
  4. [转]五种开源协议的比较(BSD,Apache,GPL,LGPL,MIT)
  5. [MetaHook] Find a function signature
  6. css003 选择器:明确设置哪些样式
  7. Codeforces Round #244 (Div. 2) A. Police Recruits
  8. 转:程序员必须知道的几个Git代码托管平台
  9. EBS 用户及其联系人的失效时间
  10. C# 值类型和引用类型的区别
  11. 实例分析jdom和dom4j的使用和区别
  12. linux内核学习之二:编译内核
  13. Win7搭建Django开发环境
  14. Windows Phone 8.1 多媒体(1):相片
  15. SpringMvc多视图配置(jsp、velocity、freemarker) velocity在springmvc.xml配置VelocityViewResolver,VelocityConfigurer,FreeMarkerConfigurer,FreeMarkerViewResolver
  16. Hadoop RPC简单例子
  17. 在wamp中添加php新版本
  18. HTTP协议详解及http1.0与http1.1http2.0的区别
  19. 注意C语言 / 要想得到精确结果
  20. Go语言从入门到放弃(三) 布尔/数字/格式化输出

热门文章

  1. OpenCV---分水岭算法
  2. net-speeder
  3. Vue.js和angular.js区别
  4. HDU 2298 三分
  5. C++ Arithmetic Exception
  6. R3—日期处理
  7. apache2启动失败(Failed to start The Apache HTTP Server.)解决方案
  8. mysql 提权总结
  9. webgote的例子(6)SQL注入(盲注)
  10. 大端小端转换,le32_to_cpu 和cpu_to_le32