JS原型和原型链

  • 原型

    • 原型(prototype):保存所有子对象共有成员的对象
    • 每个构造函数都有一个原型属性,引用了该构造函数对应的原型对象
    • 由构造函数创建的每个对象中都有一个__proto__属性,指向构造函数的原型对象
    • 在访问子对象的成员时,优先在成员本地找,找不到,再去构造函数的原型中查找
  • 创建原型

    • 创建空对象
    • 调用构造函数,为新对象添加成员
    • 设置当前对象的__proto__属性为构造函数的原型对象
    • 每个对象自有的成员,放在构造函数中
    • 所有子对象共有的成员,放在原型对象中
  • 原型链

    • 由各级对象的__proto__逐级向上引用形成的多级继承关系
    • 所有的对象都有一个__proto__属性,指向自己的父对象
  • 原型相关API

    • 判断一个属性是否可用
      • in关键字:"属性名" in 对象
        • 如果"属性名"在当前对象的原型链中,返回true
        • 如果在整条原型链上都没找到,返回false
      • 使用===undefined:说明不包含
        • 简写为(!对象.成员名)
      • 判断是否自有属性:
        • obj.hasOwnProperty("成员");
        • 如果obj本地有指定"成员",则返回true,没有返回false
      • 判断共有属性:
        • 不是自有的,还要存在于原型链上
        • if(!obj.hasOwnProperty("成员")&&"成员" in obj)
    • 获得任意对象的__proto__属性:
      • 获得父级对象
      • var 父对象=Object.getPrototypeOf(对象);
    • 判断父对象是否处在子对象原型链的上级:
      • 父对象.isPrototypeOf(子对象);
      • 只要父对象在子对象的原型链上,就返回true,否则返回false
    • 删除对象中的属性:
      • delete 对象.成员
      • 只能删除自有的成员
      • 只有var声明的全局变量不让delete
      • 使用window.或window[""]增加的全局成员可以delete
    • 判断一个对象是数组的几种方法
      • Array.prototype.isPrototypeOf(obj)
        • 如果返回true,说明是数组,否则不是
      • obj instanceof Array
        • 对象 instanceof 类型名,返回true,说明是数组
        • instancof会查找原型链上所有原型的构造函数
      • Object.getPrototypeOf(obj)==Array.prototype
      • Object.prototype.toString.call(arr)
        • override,子对象觉得父对象的成员不好用
        • 可自己定义同名的自有成员覆盖父对象
      • Object.prototype.toString.apply(arr)
        • call和apply: 在调用方法的一瞬间,替换调用方法的对象
      • Array.isArray(obj)
        • 专门判断对象是否是数组!
原文地址:https://www.cnblogs.com/SharkJiao/p/13548191.html