原型-类 应用编程语言

  • 面向对象系统

    执行环境==闭包链:静态语法被称为作用域或域;在动态环境中它们被称为上下文

  • 对象本质
    数组是一种对象,对象本质上是关联数组(“名/值”对的数组)。
    关联数组任何一个对象都可以通过Object.setPrototypeOf(obj,null)变成原子对象,如果它有一个称为
    “length”的属性,那么就理解为索引数组,索引数组本质上是关联数组的特例。
    索引数组 + 关联数组”在数据结构上就可以表达“所有的数据
    “结构”是应用编程的必须,而“解构”是底层计算的必须。从结构中把那些值数据取出来,就称为解构。
    展开语法是在两种数据类型之间的一个桥梁-一个名字和索引变换的游戏,

  • 原子对象

  • null值是一个对象,用于表达一个对象不存在。
    ECMAScript内部其实是把null值理解为“值”的,而不是“对象”,所以isObject(null)返回false

  • Null类是所有对象类型的“元类型”

class MyClass{}
> Object.setPrototypeOf(MyClass.prototype, null)  // 变为原子对象
  • 原子行为
    三类:操作原型的,操作属性表的,操作的函数行为的
    代理对象就是接管一个对象的原子行为,将它转发给被代理行为处理。

  • 对象属性的存取结果总是不确定的。
    属性不是自有的,那么它的值就是原型决定的;实例x.constructor由aFunction.prototype.construtcotr决定
    属性是存取方法的,那么它的值就是求值决定的。

  • 1 in 1..constructor
    “1..constructor”表示的就是该浮点数字面量的“.constructor”属性。
    JavaScript会自动将“值类型的数据”封装成对应包装类型的“对象”。
    检查对象“constructor”是否有属性名“1”

  • 构造器new X() (==类)

    • 类只能用 new 运算来创建,而不能使用“()”来做函数调用。

    • 如果类声明中通过 extends 指定了父类,
      使用类声明来创建对象时,对象是由父类或祖先类来创建实例,并使用this引用传递到当前类

      1. 必须在构造器方法constructor()中显式地使用super()来调用父类的构造过程,
        在退出super()时把this“抄写”给当前环境
      2. 在上述调用结束之前,是不能使用this引用的。(没有被创建出)
    • 在类的构造方法和一般构造器中返回值,是可以影响 new 运算的结果的,但会确保 new 运算得到一个对象值。

    • 设计原则:用原型来实现继承,并在类(构造器)中处理子级的抽象差异

//这里用于处理“不同的东西”
function CarEx(color){this.color=color;...}
//这里用于从父类继承“相同的东西”
CarEx.prototype=new Car("Eagle","TalonTSi",1993); //创建对象myCar=new CarEx("red")
//创建对象
myCar=new CarEx("red")
  • super
    语义是“调用父类构造方法”

  • 用于使用 被覆盖的父类同名方法

  • super指向父类
    super 这个关键字的核心,在于为每一个方法添加一个“它所属的类HomeObject”
    只能在方法中使用 super,因为只有方法有 [[HomeObject]]。
    通过当前方法的 [[HomeObject]]原型链来查找父类同名方法

  • super调用-用于 派生类中 显式完成this实例的创建
    constructor(...args){ super(...args); }

  • super.xxx()
    对super.xxx 这个super引用作“函数调用操作,调用中传入的this引用是在当前环境上下文中查找的。

  • 元属性new.target

    • 由super()向上传递new.target参数,以便父类可以使用
    • 不论传统的构造函数和非派生类的构造方法中(不需要调用super())还是非派生类,都有new.target。
      不使用super()调用的类或构造器函数,可以做根类(祖先类),使用super()调用的 作子类
posted @ 2021-12-14 17:16  忘川酒  阅读(29)  评论(0编辑  收藏  举报