zoukankan      html  css  js  c++  java
  • 面向对象之原型链

    原型链的认识

    • 既然提到原型链,就需要和构造函数联系起来进行理解;

    构造函数的认识

        其实构造函数时函数调用的一种模式,例如创建了一个函数,然后通过一个变量new了这个函数,那么这个函数就可以成为构造函数,可以从作用上来理解它为什么叫构造函数,直白点可以说是来构造一个对象出来的,实际上是实例化了一个对象出来,任何通过new来进行操作的函数都可以成为构造函数。
        接下来那么这个被new出来的对象就会继承创建出来的那个函数的属性,前提是在构造函数内部通过this.属性名这样的属性new出来的实例对象才能拥有。

    引出原型链的认识

        当new出的这个实例对象需要访问某个属性时,首先它会在其本身查找,也可以理解为是先看其构造函数内部有没有通过this.属性名初始化这个属性,如果没有找到这个属性,也就是没有从本身找到这个属性,那么它就会往上查找,这个查找过程中查的那条链就叫做原型链,具体了解可以看引申出来属性搜索原则,下面有总结,其实这也和原型继承这个机制是联系在一起的,可以说设计这个原型链就是为原型继承服务的;

    构造函数的整个过程:

    • 1、new申请内存,创建对象,(new运算符可以称作新建运算符);
    • 2、调用构造函数,构造函数有一个隐式参数,即this;
    • 3、刚创建出来的对象的引用赋值给this,由函数处理;(其实主要就是利用new能够动态改变this的指向)
    • 4、在构造函数中利用this.成员 = 值来给对象添加成员

    构造函数的优势:

    • ①、对象就有独立的原型对象;
    • ②、也具有类型名了

    属性搜索原则

    • ①、在当前对象中找;
    • ②、在构造函数定义规则中找;
    • ③、在其原型对象中找;
    • ④、在其原型对象的原型对象中找…….直到Object.prototype,这等于就是在其原型链上寻找
    • ⑤、如果没有则返回undefined;

    稍微深入的理解下原型

    其实对象中有一个属性 叫 proto
    通过调试可以发现 对象的 proto 与创建(实例化)它的构造函数的 prototype 是一个东西
    看下面的代码测试:

    1 function F() { //声明一个构造函数
    2 
    3 }
    4 var o = new F(); //通过这个构造函数实例化一个对象o
    5 
    6 console.log( o.__proto__ === F.prototype ); //true

    注意一下 proto 是非标准属性,这里也只是辅助理解来运用下,实际工作中不要采用它来进行业务逻辑

    原型对象与原型属性

    F.prototype 是构造函数 F 的原型属性
    F.prototype 是对象 o 的原型对象

    proto与prototype有什么区别

    _proto_是站在对象的角度讨论其原型对象
    prototype是站在构造函数的角度讨论其原型属性,或构造函数创建的对象的原型对象
    也可以理解成所站的位置不同,就会有不同的角色。

    上面的这些理论知识还是会有些抽象,抽时间我会把原型链画一下,那样理解起来就清晰了。

  • 相关阅读:
    网络运维与管理2013超值精华本
    [置顶] JQuery实战总结三 标签页效果图实现
    ASP.NET 联想控件(Autocomplete)测试可用 ascx
    python手记(48)
    [Android]解决3gwap联网失败:联网请求在设置代理与直连两种方式的切换
    「两」创建一个带 ssh 镜座服务(修订版)--采用 Dockerfile 创
    美国同事实习
    javascript相框echarts插件实现酷立方效果图的人
    Docker container 集装箱说明
    tinkerpop(1) 地图数据库console科研
  • 原文地址:https://www.cnblogs.com/webhb/p/5615056.html
Copyright © 2011-2022 走看看