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

面向对象的应用:

<body>
    <div class="box1">
        <h1></h1>
        <ul></ul>
    </div>
    <div class="box2">
        <h1></h1>
        <ul></ul>
    </div>

    <script>
        var data1 = {
            title:"体育",
            list:["体育-1","体育-2","体育-3"]
        }
        var data2 = {
            title:"综艺",
            list:["综艺-1","综艺-2","综艺-3"]
        }
        function CreateList(select,title,list){
            this.ele = document.querySelector(select)
            this.title = title,
            this.list = list,
            this.render = function(){
                var h1 = this.ele.querySelector("h1")
                var ul = this.ele.querySelector("ul")
                // console.log(h1,ul)
                h1.innerHTML = this.title
                ul.innerHTML = this.list.map(item=>`<li>${item}</li>`).join("")
            }
        }

        var obj1 = new CreateList(".box1",data1.title,data1.list)
        obj1.render()
        var obj2 = new CreateList(".box2",data2.title,data2.list)
        obj2.render()
        
    </script>
</body>

结果:

  • 现在我们可以使用“面向对象的原型”的思路来做,把render函数拿出来,用原型表示:
<body>
    <div class="box1">
        <h1></h1>
        <ul></ul>
    </div>
    <div class="box2">
        <h1></h1>
        <ul></ul>
    </div>

    <script>
        var data1 = {
            title:"体育",
            list:["体育-1","体育-2","体育-3"]
        }
        var data2 = {
            title:"综艺",
            list:["综艺-1","综艺-2","综艺-3"]
        }
        function CreateList(select,title,list){
            this.ele = document.querySelector(select)
            this.title = title,
            this.list = list
        }
        CreateList.prototype.render = function(){
                var h1 = this.ele.querySelector("h1")
                var ul = this.ele.querySelector("ul")
                // console.log(h1,ul)
                h1.innerHTML = this.title
                ul.innerHTML = this.list.map(item=>`<li>${item}</li>`).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>
</body>
  • 把render函数拿出来写,按照面向对象的原型方法写就是上面的:构造函数.prototype.render这样子;
  • 因为对象有一个属性__proto__属性===构造函数的原型prototype,所以对象可以访问到render函数,也就是obj1.render成立的原因; 
  • 对象.__proto__===构造函数.prototype

为什么会引入原型的概念:

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

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

构造函数也是一个对象,

原型链的概念:

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

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

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

Object.prototype或者null

链状结构:

  • 当一个对象我们不知道准确的是谁构造的时候,我们呢就把它看成 Object 的实例化对象

  • 也就是说,我们的 构造函数 的 prototype 的 __proto__ 指向的是 Object.prototype

  • 那么 Object.prototype 也是个对象,那么它的 __proto__ 又指向谁呢?

  • 因为 Object 的 js 中的顶级构造函数,我们有一句话叫 万物皆对象

  • 所以 Object.prototype 就到顶了,Object.prototype__proto__ 就是 null

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

陌一一

你的鼓励是我最大的动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值