JavaScript 对象创建 2.0(Day17)

18 阅读2分钟

原型对象

  • 程序员创建的每一个函数,解析器均会向该函数中添加一个属性prototype

  • prototype属性对应一个对象,该对象即原型对象

  • 若函数作为普通函数进行调用,prototype属性没有作用

  • 若函数作为构造函数进行调用,其所创建的所有对象(实例)中均有一个隐含属性

    • 该属性指向构造函数的原型对象

    • 可通过__proto__ 访问该属性

          function MyClass() {
          }
      ​
          var mc = new MyClass()
      ​
          console.log(MyClass.prototype==mc.__proto__)
          // 结果:true
      
  • 原型对象相当于一个公共区域,所有同一个类的实例均可访问原型对象

    MyClass.prototype.x=123
    
  • 当用户访问对象的属性或方法时,会先在自身中寻找

    • 若存在,则直接使用

    • 若没有则去其原型对象中寻找,找到则使用,没找到则返回undefined

          console.log(mc.x)
          // 结果 :123
          console.log(mc.a)
          // 结果 : undefined   
      
  • 创建构造函数时,将对象中共有的属性和方法,统一设置到该原型对象中

    • 优点:

      • 不用分别为每一个对象添加属性和方法
      • 不会污染全局作用域
  • 使用in检查对象中是否含有某个属性

    • 对象中没有但其原型中有,会返回true

      console.log(mc.hasOwnProperty('name'))
      // 结果:false
      
  • 使用hasOenProperty方法检查对象自身中是否含有某个属性,其结果为布尔值

  • 原型对象也是对象,也有其原型

  • 用户使用一个对象的属性或方法时,会优先在其自身寻找

    • 自身中包含,则直接使用

    • 自身中不包含,则向上其原型对象中寻找

      • 若原型对象中包含则使用
      • 若原型对象中不包含则再向上一级原型寻找,直至Object对象中的null结束,此时返回undefined