JavaScript原型链prototype chain

简介:

为了在JavaScript更好地去面向对象,我们需要看清楚一些事情的本质,比如:原型链!

 

 
  1. <script type="text/javascript"
  2.  
  3. /* 
  4.    每个对象实例都有个属性成员用于指向到它的instanceof 对象(暂称为父对象)的原型(prototype) 
  5.    我们把这种层层指向父原型的关系称为[原型链 prototype chian] 
  6.    原型也具有父原型,因为它往往也是一个对象实例,除非我们人为地去改变它 
  7.  
  8.  
  9.    Function的父原型指向到Function的原型,Function.prototype的父原型是Object的原型 
  10.    Object的父原型也指向到Function的原型,Object.prototype是所有父原型的顶层 
  11.    在spiderMonkey引擎中,父原型可以通过 __proto__ 进行访问 
  12. */ 
  13.  
  14. Function.prototype.hi = function(){alert('hi Function');} 
  15. Object.prototype.hi = function(){alert('hi Object');} 
  16.  
  17. var a = function(){ 
  18.     this.txt = "a"
  19. a.prototype = { 
  20.     say:function(){alert('a');} 
  21.  
  22. alert(a instanceof Function);//a是Function的实例; 
  23. alert(a.__proto__ === Function.prototype);//a的父原型指向到Function的原型; 
  24.  
  25. alert(Function instanceof Object);//Function是Object的实例; 
  26. alert(Function.__proto__ === Function.prototype);//Function的父原型指向到Function的原型; 
  27. alert(Function.prototype.__proto__ === Object.prototype);//Function的原型的父原型指向到Object的原型 
  28.  
  29. alert(Object.__proto__ === Function.prototype);//Object的父原型指向到Function的原型; 
  30. alert(Object.prototype.__proto__);//Object的原型是所有父原型的顶端,它不再具有父原型; 
  31.  
  32.  
  33. alert(a.prototype instanceof Object);//a的原型也是一个对象 
  34. alert(a.prototype.__proto__ === Object.prototype);//a的原型的父原型指向Object的原型 
  35.  
  36.  
  37.  
  38. var A = function(){}; 
  39. A.prototype = new a(); 
  40. A.prototype.say = function(){ 
  41.     alert('A'); 
  42.  
  43. alert(A instanceof Function);//A是Function的实例 
  44. alert(A.__proto__ === Function.prototype);//A的父原型指向到Function的原型 
  45. alert(A.prototype instanceof a);//A的原型是a的实例 
  46. alert(A.prototype.__proto__ === a.prototype);//A的原型的父原型指向到a的原型 
  47.  
  48.  
  49. var iA = new A();//iA是A的实例,iA.__proto__ === A.prototype 
  50. var iB = new a();//iB是a的实例,iB.__proto__ === a.prototype 
  51.  
  52. iA.hi(); 
  53. /* 
  54. iA本身没有hi方法(构造中没有,自己也没有定义过), 
  55. 于是找iA的prototype,没有找到, 
  56. 于是找iA.__proto__即A.prototype,也没有找到, 
  57. 于是再找A.prototype.__proto__即a.prototype,仍然没有发现, 
  58. 继续查找a.prototype.__proto__即Object.prototype,哇,发现了hi,于是调用它,停止查找 
  59. 输出:hi Object 
  60. */ 
  61.  
  62. iB.hi(); 
  63. /* 
  64. iB本身没有hi方法(构造中没有,自己也没有定义过), 
  65. 于是找iB的prototype,没有找到, 
  66. 于是找iB.__proto__即a.prototype,仍然没有发现, 
  67. 继续查找a.prototype.__proto__即Object.prototype,哇,发现了hi,于是调用它,停止查找 
  68. 输出:hi Object 
  69. */ 
  70.  
  71. a.hi(); 
  72. /* 
  73. a本身没有hi方法(构造中没有,自己也没有定义过), 
  74. 于是找a的prototype,没有找到, 
  75. 于是找a.__proto__既Function.prototype,哇,发现了hi,于是调用它,停止查找 
  76. 输出:hi Function 
  77. */ 
  78.  
  79. iA.say(); 
  80. /* 
  81. iA本身没有say方法(构造中没有,自己也没有定义过), 
  82. 于是找iA的prototype,没有找到, 
  83. 于是找iA.__proto__即A.prototype,哇,发现了say,于是调用它,停止查找 
  84. 所以,这里调用的是A.prototype.say 
  85. 输出:A 
  86. */ 
  87.  
  88. iB.say(); 
  89. /* 
  90. iB本身没有say方法(构造中没有,自己也没有定义过), 
  91. 于是找iB的prototype,没有找到, 
  92. 于是找iB.__proto__即a.prototype,哇,发现了say,于是调用它,停止查找 
  93. 所以,这里调用的是a.prototype.say 
  94. 输出:a 
  95. */ 
  96.  
  97. iA.bad(); 
  98. /* 
  99. iA本身没有bad方法(构造中没有,自己也没有定义过), 
  100. 于是找iA的prototype,没有找到, 
  101. 于是找iA.__proto__即A.prototype,也没有找到, 
  102. 于是再找A.prototype.__proto__即a.prototype,仍然没有发现, 
  103. 继续查找a.prototype.__proto__即Object.prototype,终于是找不到了,停止查找 
  104. 返回错误,iA.bad不是一个function 
  105. */ 
  106.  
  107. </script>  

通过这篇文章可以更好的理解javascript的原型链。




本文转自sucre03 51CTO博客,原文链接:http://blog.51cto.com/sucre/387809,如需转载请自行联系原作者

相关文章
|
6天前
|
JavaScript
什么是js的原型链
什么是js的原型链
|
1月前
|
JavaScript
JS原型对象prototype
JS原型对象prototype
|
1月前
|
JavaScript 前端开发
在JavaScript中,如何优化原型链的性能?
在JavaScript中,如何优化原型链的性能?
16 2
|
1月前
|
JavaScript 前端开发
谈谈对 JavaScript 中的原型链的理解。
谈谈对 JavaScript 中的原型链的理解。
18 1
|
1月前
|
JavaScript 前端开发
js继承的超详细讲解:原型链继承、构造函数继承、组合继承、原型式继承、寄生式继承、寄生组合式继承、class继承
js继承的超详细讲解:原型链继承、构造函数继承、组合继承、原型式继承、寄生式继承、寄生组合式继承、class继承
54 0
|
1月前
|
JavaScript 前端开发
深入理解 JavaScript 对象原型,解密原型链之谜(下)
深入理解 JavaScript 对象原型,解密原型链之谜(下)
|
1月前
|
JavaScript 前端开发
深入理解 JavaScript 对象原型,解密原型链之谜(上)
深入理解 JavaScript 对象原型,解密原型链之谜(上)
|
2月前
|
JavaScript 前端开发
解释一下js的原型和原型链
解释一下js的原型和原型链
17 0
|
2月前
|
JavaScript
Node.js【GET/POST请求、http模块、路由、创建客户端、作为中间层、文件系统模块】(二)-全面详解(学习总结---从入门到深化)
Node.js【GET/POST请求、http模块、路由、创建客户端、作为中间层、文件系统模块】(二)-全面详解(学习总结---从入门到深化)
27 0
|
2月前
|
消息中间件 Web App开发 JavaScript
Node.js【简介、安装、运行 Node.js 脚本、事件循环、ES6 作业队列、Buffer(缓冲区)、Stream(流)】(一)-全面详解(学习总结---从入门到深化)
Node.js【简介、安装、运行 Node.js 脚本、事件循环、ES6 作业队列、Buffer(缓冲区)、Stream(流)】(一)-全面详解(学习总结---从入门到深化)
77 0