用生命谱写代码的赞歌

0%

原型与原型链

原型

  1. 概念:所谓原型就是指函数的 prototype 属性所引用的对象
    • 只要定义一个函数,那么就会创建其原型
    • 由上述函数创建出来的所有对象,都可以直接访问到原型上的成员
  2. 作用:实现同类对象之间的数据共享。
  3. 获取原型方式
    • 通过函数:fnName.prototype
    • 通过对象:objName.__proto__
    • 注意:以 __ 开头和结尾的属性均为非标准属性,原型默认具有 constructor 属性,引用的就是其构造函数

原型特性

动态性:置换原型记得重新要设置 constructor 属性指向构造函数!!!

  • 动态性
    • 在已有的原型上扩展成员,直接反映到已创建出来的对象上
    • 如果置换了已有的原型,那么会反映到后面新创建的对象,而不会影响之前创建的对象
  • 唯一性
    • 由同一个构造函数创建出来的所有对象,都共享一个原型
  • 不可变性(对于基本类型的属性)
    • 不能通过对象来修改原型上的成员(仅对基本类型属性而言)
  • 共享性
    • 所有的对象都可以直接访问其原型上的成员

组合方式创建对象

  • 组合原型和构造函数一起来创建对象
  • 将私有的属性写在构造函数内
  • 将共有的属性或行为写到其原型上

__proto__ 与 prototype

  1. 函数(方法)拥有自己特有的属性 – 原型属性 (prototype),这个属性是一个指针,指向一个对象,这个对象的用途就是包含所有实例共享的属性和方法(这个对象叫做原型对象)。原型对象也有一个属性,叫做 constructor,这个属性包含了一个指针,指回原构造函数。

  2. 在 js 中,万物皆对象。方法 (Function) 是对象,方法的原型 (Function.prototype) 是对象。因此,他们都会具有对象共有的特点。即对象具有属性 __proto__,可称为隐式原型。一个对象的隐式原型指向构造该对象的构造函数的原型,这也保证了实例能够访问在构造函数原型中定义的属性和方法。

继承

  1. 注意:其他面向对象语言 C# Java swift 类与类之间继承,而在js中,是对象与对象之间的继承

  2. 概念:就是指 一个对象有权去访问另一个对象上的成员(属性和方法)

  3. 继承的实现

    • 原型式继承
      1. 在原有的原型上扩展
      2. 置换原型
    • 混入式:将要继承的对象上的所有成员拷贝一份,添加到本身。
  4. Object.create方法

    • 实现原型式继承(通过置换原型方法)
    • 语法:
    1
    var newObj = Object.create(parent);
  5. 相关结论:

    • Object.prototype 的原型为 null
    • 默认原型对象的原型为 Object.prototype
  6. 属性搜索原则:当访问对象的某个属性时,

    • 首先,在对象本身上查找,如果找到就返回值,并停止查找
    • 如果没有找到就向其原型对象上查找,如果找到就返回值,并停止查找;
    • 如果在没有找到,就继续向其原型的原型对象上查找,直到 Object.prototype
    • 此时如果找到就返回值,否则值为 undefined

原型链的概念

  • 所谓原型链 就是指从一个对象到 Object.prototype 之间存在一条体现继承层次关系的链式结构,这个结构被称为对象的原型链。
  • 本质:链上的每一个对象都是通过 __proto__ 属性连接起来的。

绘制原型链

  • 先简写对象的原型链
  • 将上述原型链上的所有对象绘制在图形上。并且将和原型链相关的属性添加到对象上
  • 给对象的每一个属性确定指向
  • 如果在图形上的每一个对象的属性都有正确指向,说明绘制完成

Object.prototype 的方法简介

  1. hasOwnProperty

    • has 有
    • own 自己的
    • property 属性
    • 语法:obj.hasOwnProperty(“propName”)
    • 用来判断指定属性是否为对象自身的,而不是继承过来的;如果是自身的就返回 true,否则返回 false
  2. isPrototypeOf

    • is 是
    • Prototype 原型
    • of 的
    • obj1.isPrototypeOf(obj2)
    • 用来判断 obj1 对象是否为 obj2 对象的原型;如果是,就返回 true,否则返回 false
  3. propertyIsEnumerable

    • property 属性
    • is 是
    • Enumerable 可枚举的,可以使用 for in 遍历出来的属性
    • obj.propertyIsEnumerable(‘propName’)
    • hasOwnProperty 升级版:
    • 满足这2个条件返回 true,否则返回 false
      • 指定的属性必须是对象本身的
      • 该属性必须可枚举

装箱 与 拆箱

  • 将基本数据类型 转换为 复合数据类型,这个过程被称为 装箱
  • 将复合数据类型 转换为 基本数据类型,这个过程被称为 拆箱

强调几点

  • 默认原型对象才具有 constructor 属性 (置换原型之后需要手动添加 constructor 属性)
  • 只有函数具有 prototype 属性(除了 Function.prototype
  • 任意的对象都具有 __proto__ 属性

instanceof介绍

  • obj instanceof constructor(构造函数)

  • 规则:如果 constructor 的原型 出现在 obj 的原型链上的话,表达式返回值为 true,否则 false