• js:语言精髓笔记7----原型继承


    面向对象有三个基本特性:封装,继承,多态;如果都满足的话称为面向对象语言;而部分满足则称为基于对象语言

    数据类型实现模型描述:

     

    JavaScript对象模型:

    构造过程:函数->构造器

    • 构造器首先是一个函数,可以理解为函数初始化的时候其prototype是无值的,只有在需要引用到原型时,才具有构造器的的特性;
    • 函数的原型总是一个标准的、系统内置的Object()构造器的实例;
    • 该实例创建后construct属性总先被赋值为当前函数;

    继承复制:

    • 构造复制:每构造一个实例就从原型中复制一个映像,它和原型占用了相同的空间;
    • 写时复制:每构造一个实例就使其指向原型;当读的时候顺着指示去读原型;当写对象的时候才将原型复制下来;以后读没写过的实例顺着指示,写过的则直接访问映像;
    • 优化的写复制(也是js原型继承采用的):把写复制的粒度从原型变成成员,仅当要写某个实例的成员时,将成员的信息复制到实例映像中,产生一张成员列表;
      • 确保在读取的时候成员表首先访问到;
      • 如果在成员表中找不到,则沿着对象遍历整个原型链;

    空对象(null):

    • 属于对象类型,所以可以进行枚举;
    • 对象是空值,所以枚举不出任何属性或方法;
    • 不是来自Object()构造器的实例,instanceof返回false   //null instanceof Object;

    空的对象({}/new Object()):

    • 空的对象只有预定义的属性和方法,这些并不会被枚举到;
    • 空的对象是所有对象的基础;
    • Object()构造器的原型就是一个空的对象;
    • 构造:根据继承复制,可以理解空对象的基本构造为
      • 一个^proto指向Object.prototype;
      • 一个^proto指向一个空表;

    预定义属性和方法:

    • 原型(Object.prototype):
      • toString                                               //动态语言
      • toLocaleString                                      //动态语言
      • valueof                                                //动态语言
      • construct                                             //对象系统:构造
      • propertyIsEnumerable                          //对象系统:属性
      • hasOwnProperty                                   //对象系统:属性
      • isPrototypeof                                        //对象系统:原型
    • 构造器(一般函数):
      • call                                                     //函数式语言
      • apply                                                  //函数式语言
      • caller                                                  //函数式语言
      • bind                                                   //函数式语言
      • arguments                                          //动态语言
      • length                                                //动态语言
      • prototype                                           //对象系统:原型  
    • EM5对Object()构造器扩展:
      • create                                               //对象系统:构造
      • getPrototypeOf                                  //对象系统:原型
      • defineProperty                                   //对象系统:属性
      • defineProperties                                 //对象系统:属性
      • getOwnPropertyDescriptor                  //对象系统:属性
      • keys                                                 //对象系统:属性
      • getOwnPropertyNames                       //对象系统:属性
      • seal                                                  //对象系统:属性
      • freeze                                               //对象系统:属性
      • preventExtensions                             //对象系统:属性
      • isSealed                                           //对象系统:属性
      • isFrozen                                           //对象系统:属性
      • isExtensible                                     //对象系统:属性

     原型链:

    • constructor的维护:
      • 在重置原型后就修改原型的constructor属性;
        MyObjectEx.prototype = new MyObject();
        MyObjectEx.protptype.constructor = MyObjectEx;
      • 在构造器内初始化实例时保证constructor属性;
        function MyObjectEx() {
            this.constructor = arguments.callee;
        }
    • 原型链prototype;
    • 内部原型链:
      • 面向对象继承性的约定:子类必须与父类具有相似性;
      • 对象实例内部有_proto_属性,用户无法访问;即使修改constructor,也不用担心实例与父类的一致性;
      • 总结:内部原型链是JS原型继承机制所需的,而通过constructor与prototype所维护的构造器原型链是用户代码回溯的时候需要的;

     原型继承的实质:

    • 基于原型继承的对象系统:将对象(类)的继承关系与对象(类)的行为描述进行分离; //理论上可以先构建一个没有任何成员的继承系统,然后不断修改原型。
  • 相关阅读:
    Python request
    Dockerfile详解
    k8s 英文文档翻译
    k8s 相关命令
    k8s 廖老师的分享
    Docker docker-compose安装
    Mysql 锁库与锁表
    Docker 二进制安装docker
    Java多线程的同步控制记录
    JAVA并行程序基础
  • 原文地址:https://www.cnblogs.com/jinkspeng/p/4079689.html
Copyright © 2020-2023  润新知