原型

53 阅读3分钟

原型

  • 每一个函数 都有一个属于自己的原型 作用:我们会在原型内部放一些公共的方法,目的不是为了让构造函数去使用,而是为了让实例化对象去使用
  • 任何一个数组的构造函数 都是 Array
  • 任何一个对象的构造函数 都是 Object
  • 任何一个函数的构造函数 都是 Function

万物皆对象

  • js 中万物都可以称为对像

对象

  • 含义1: 一种数据格式
  • 含义2:某一类事物的个体实例(如猫 有白猫 ,黑猫, 花猫, 这些不同的猫都可以说是猫这个类别的具体的一个对象)

原型链

  • 原型链:
  •  查找对象的某一个属性:
    
  •  先在对象内部开始查找, 找到直接使用, 然后停止查找
    
  •  如果没有找到, 会找对象的 obj.__proto__, 如果找到直接使用, 然后停止查找
    
  •  如果这里没找到, 会继续去对象的 __proto__ 查找, 找到直接使用, 然后停止查找
    
  •  如果还是没找到, 会继续向上查找
    
  •               ...
    
  • 直到找到顶层作用对象    Object.prototype, 找到就是用, 找不到 undefined
    

问题1: p 的 proto 指向谁?

  •      + p 是 Person 的实例化对象
    
  •      + __proto__ 指向自身构造函数的原型
    
  •      + p.__proto === Person.prototype
    
  • 问题2: Person 的 proto 指向谁?
  •  + Person 是构造函数, 本质上函数
    
  •  + 只要是一个函数, 他就是 Function 的实例
    
  •  + Person.__proto__ 指向了 他的构造函数的原型, 构造函数是 Function, 那 *     么构造函数的 原型 Function.prototype
    
  •  + Person.__proto__ === Function.prototype
    
  • 问题3: Person.prototype 的 proto 指向谁?
  •  + Person.prototype 其实就是  构造函数 Person 的原型对象质上就是对象
    
  •  + 只要是一个 对象, 他就是 Object 的实例
    
  •  + Person.prototype.__proto__ 指向了 他的构造函数的原型,函数 Object,  *  那么构造函数的原型 Object.prototype
    
  • 问题4: Function 的 proto 指向谁?
  •  + Function 是构造函数, 本质上就是一个函数
    
  •  + 只要是一个函数, 他就是 Function 的实例
    
  •  + Function.__proto__ 指向了 他的构造函数的原型, 构造Function, 那么 构 *  造函数的原型 Function.prototype
    
  •  + Function.__proto__ === Function.prototype
    
  • 问题5: Function.prototype 的 proto 指向了谁?
  •  + Function.prototype 其实就是 构造函数 Function 的原型对本质上是对象
    
  •  + 只要是一个对象, 他就是 Object 的实例
    
  •  + Function.prototype.__proto__ 指向了 他的构造函数的原型造函数    * *  Object, 那么构造函数的原型 Object.prototype
    
  •  + Function.prototype.__proto__ === Object.prototype
    
  • 问题6: Object 的 proto 指向了谁?
  •  + Object 是一个构造函数, 本质上还是一个函数
    
  •  + 只要是一个函数, 那么他的构造函数 就是 Function
    
  •  + Object.__proto__ 指向了他的构造函数的原型, 他的构造函Function, 那*    么   构造函数的原型 Function.prototype
    
  •  + Object.__proto__ === Function.prototype
    
  • 问题7: Object.prototype 的 proto 指向了谁?
  •  + Object.prototype 是构造函数 Object 的原型对象, 本质上个对象
    
  •  + 但是重点: Object.prototypeJS 顶层的对象
    
  •  + Object.prototype.__proto__ === null
     
    

  • 1 typeof() 可以判断基本数据类型,
  • 2 constructor 是原型里的一个属性 , constructor 可以判断当前数据的 构造函数是谁 对于对象中的的属性实际上是可以修改的,其不能够判断 undefined 和 null 两种数据类型
  • 3 instanceof instanceof 可以判断 左边的构造函数是否等于右边的构造函数 语法: 检测的数据 空格 instanceof 空格 构造函数 问题: 不能判断 undefined 和 null
  • 4 Object.prototype.toString.call(要判断的数据类型) Object 这个构造函数的 原型内部 有一个 toString 的方法 这个方法能够帮我们将数据结构转为字符串的形式 '[object 数据结构]' 我们在使用的时候 如果需要判断其他数据类型, 需要使用 .call这个方法改变内部 this 指向 这个方法任何数据类型都能准确判断(推荐使用)