• 面向对象的原型:prototype,原型链


    面向对象的应用:

    1. <div class="box1">
    2. <h1>h1>
    3. <ul>ul>
    4. div>
    5. <div class="box2">
    6. <h1>h1>
    7. <ul>ul>
    8. div>
    9. <script>
    10. var data1 = {
    11. title:"体育",
    12. list:["体育-1","体育-2","体育-3"]
    13. }
    14. var data2 = {
    15. title:"综艺",
    16. list:["综艺-1","综艺-2","综艺-3"]
    17. }
    18. function CreateList(select,title,list){
    19. this.ele = document.querySelector(select)
    20. this.title = title,
    21. this.list = list,
    22. this.render = function(){
    23. var h1 = this.ele.querySelector("h1")
    24. var ul = this.ele.querySelector("ul")
    25. // console.log(h1,ul)
    26. h1.innerHTML = this.title
    27. ul.innerHTML = this.list.map(item=>`
    28. ${item}
    29. `).join("")
  • }
  • }
  • var obj1 = new CreateList(".box1",data1.title,data1.list)
  • obj1.render()
  • var obj2 = new CreateList(".box2",data2.title,data2.list)
  • obj2.render()
  • script>
  • 结果:

    • 现在我们可以使用“面向对象的原型”的思路来做,把render函数拿出来,用原型表示:
    1. <div class="box1">
    2. <h1>h1>
    3. <ul>ul>
    4. div>
    5. <div class="box2">
    6. <h1>h1>
    7. <ul>ul>
    8. div>
    9. <script>
    10. var data1 = {
    11. title:"体育",
    12. list:["体育-1","体育-2","体育-3"]
    13. }
    14. var data2 = {
    15. title:"综艺",
    16. list:["综艺-1","综艺-2","综艺-3"]
    17. }
    18. function CreateList(select,title,list){
    19. this.ele = document.querySelector(select)
    20. this.title = title,
    21. this.list = list
    22. }
    23. CreateList.prototype.render = function(){
    24. var h1 = this.ele.querySelector("h1")
    25. var ul = this.ele.querySelector("ul")
    26. // console.log(h1,ul)
    27. h1.innerHTML = this.title
    28. ul.innerHTML = this.list.map(item=>`
    29. ${item}
    30. `).join("")
  • }
  • var obj1 = new CreateList(".box1",data1.title,data1.list)
  • obj1.render()
  • var obj2 = new CreateList(".box2",data2.title,data2.list)
  • obj2.render()
  • //对象._proto_ === 构造函数.prototype
  • script>
  • 为什么会引入原型的概念:

    因为按照第一种方法,当我们构造多个函数时,这个函数里面其实在堆区里占用的是不同的空间不是一个空间,而一个render函数虽然执行的代码是一样的,但是obj1和obj2执行的render函数还是不在一个区域,这样就会造成,构造函数越多,空间重复占用越大,浪费空间。

    但是我们用原型就可以解决这个问题,用每一个对象去调用同一个原型即可,不会造成重复的空间浪费。

    构造函数也是一个对象,

    原型链的概念:

    面试题:obj.toString():为什么对象都有toString这个方法:

    解答:在创建完构造函数以后,obj对象有一个__proto__方法,会在自己对象上找,如果找不到就去它的构造函数prototype上去找,找不到就去上一级Object的prototype上找 ,刚好Object上面是有的。

    整个原型的顶点是什么呢:有两种解释:

    Object.prototype或者null

    链状结构:

  • 相关阅读:
    cuda卸载
    你会自动化测试吗?不要再自欺欺人了
    css-pseudo-class锚伪类
    cmd关闭kill进程
    CFS线程调度机制分析
    AUTOSAR汽车电子嵌入式编程精讲300篇-基于 FIFO 和优先级序列 CAN 总线系统(续)
    IOS停机卡免流线路下载更新
    RealVCN连接超时怎么解决
    【数据仓库】数仓分层方法详解与层次调用规范
    LightDM简介
  • 原文地址:https://blog.csdn.net/a1598452168YY/article/details/127710200