乐趣区

关于javascript:JavaScript高级-原型

函数的 原型(prototype)

  1. 函数的 protot 属性

    • 每个函数都有一个 prototype 属性,它默认指向一个 object 空对象(即称为:原型对象)
    • 原型对象中有一个属性 constructor,它指向函数对象
  2. 给原型对象增加属性(个别都是办法)

    • 作用:函数的所有实例对象主动领有原型中的属性(办法)

      // 每个函数都有一个 prototype 属性,它默认指向一个 Object 空对象(即称为:原型对象)console.log(Date.prototype , typeof Date.prototype)
      
      function fun () {}
      fun.prototype.test = function () {console.log('test()')
      }
      console.log(fun.prototype)  // 默认指向一个 Object 空对象(没有咱们的属性)// 原型对象中有一个属性 constructor,它指向函数对象
      console.log(Date.prototype.constructor===Date)
      console.log(fun.prototype.constructor===fun)
      
      // 给原型对象增加属性(个别是办法)==> 实例对象能够拜访
      

显式原型和隐式原型

  1. 每个函数 function 都有一个 prototype,即显式原型(属性)
  2. 每个实例对象都有一个__proto__ , 可称为隐式原型(属性)
  3. 对象的隐式原型的值为其对应构造函数的显式原型的值
  4. 内存构造
  5. 总结

    • 函数的 prototype 属性:在定义函数时主动增加的,默认值是一个空 Object 对象
    • 对象的__proto__属性:创建对象时主动增加的,默认值为构造函数的 prototype 属性值
    • 程序员能间接操作显式原型,但不能间接操作隐式原型(ES6 之前)
  // 定义构造函数

  function Fn(){    // 外部语句:this.prototype = {}

  }

  //1. 每个函数 function 都有一个 prototype,即显式原型,默认指向一个空的 Object 对象

  console.log(Fn.prototype)

  //2. 每个实例对象都有一个__proto__  , 可称为隐式原型

  var fn = new Fn()    // 外部语句:this.__proto__=Fn.prototype

  console.log(fn.__proto__)

  //3. 对象的隐式原型的值为其对应构造函数的显式原型的值

  console.log(Fn.prototype===fn.__proto__)     //true

  // 给原型增加办法

  Fn.prototype.test = function(){console.log('test')

  }

  // 通过实例调用原型的办法

  fn.test()

退出移动版