4.原型和原型链.html 2.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172
  1. <!DOCTYPE html>
  2. <html lang="en">
  3. <head>
  4. <meta charset="UTF-8">
  5. <meta name="viewport" content="width=device-width, initial-scale=1.0">
  6. <title>Document</title>
  7. </head>
  8. <body>
  9. <script>
  10. // function fn1() {
  11. // console.log(this,'fn1')
  12. // return 1;
  13. // }
  14. // console.log( fn1())
  15. /**
  16. * 构造函数
  17. * 1.首字母大写
  18. * 2.使用时 通过new去进行实例化
  19. * 3.this执行当前函数本身
  20. * 4.反出值 不用return
  21. * 属性 写在构造函数下
  22. * 方法 写在原型下
  23. */
  24. // function Fn2() {
  25. // console.log(this,'fn2');
  26. // return 2
  27. // }
  28. // console.log(new Fn2(),'调用')
  29. function Person(name, age) {
  30. this.name = name;
  31. this.age = age;
  32. console.log(this.name, this.age)
  33. }
  34. Person.prototype.address = function () {
  35. console.log('我叫' + this.name, '我叫住在翻斗花园')
  36. }
  37. let p1 = new Person("图图", 3)
  38. console.log(p1)
  39. p1.address();
  40. /**
  41. * 原型:
  42. * 1.构造函数中自带了constructor(构造器)和prototype(原型对象/显性方法)
  43. * 2.实例对象中自带了_proto_方法 指向当前对象原型
  44. * 3.prototype 与 _proto_ 等价的
  45. * 4.constructor指向的是prototype的构造函数
  46. *
  47. * 原型链:
  48. * 访问对象属性时 先从对象本身属性上寻找
  49. * 通过 _proto_ 去原型上寻找
  50. * 若还没找到 则在原型对象prototypes上寻找 找到就返回 未找到(undefined)/null
  51. *
  52. *
  53. *
  54. *
  55. * 面试题
  56. * 所有的函数数据类型都天生自带一个prototype属性,该属性的属性值是一个对象,指向原型
  57. prototype的属性值中天生自带一个constructor属性,其constructor属性值指向当前原型所属的构造函数/类
  58. 所有的对象数据类型(实例),都天生自带一个_proto_属性,该属性的属性值指向当前实例所属类的原型
  59. 总结
  60. 把所有的对象共用的属性全部放在堆内存的一个对象(共用属性组成的对象)
  61. ,然后让每一个对象的 __proto__存储这个「共用属性组成的对象」的地址。
  62. 而这个共用属性就是原型,原型出现的目的就是为了减少不必要的内存消耗。
  63. 而原型链就是对象通过__proto__向当前实例所属类的原型上查找属性或方法的机制
  64. ,如果未找到,则去Object的原型上找,还是没有找到想要的属性或者是方法则查找结束,
  65. 最终会返回undefined
  66. */
  67. </script>
  68. </body>
  69. </html>