任何函数都有prototype

  1. function fn() {}
  2. console.dir(fn.prototype)

image.png
一般情况下,函数正常调用时的我们用不到这个属性(用不到不代表不存在)
某些情况下,这个却能用到

new一个函数创建对象

买房小故事

买房时:
销售小吴:我们先看一下房子的户型图,我们这里所有的房子都是带花园的。看这是房子,出门就是一个花园。要不现在就带您去花园看看?
我:(心里暗喜,价格虽然不便宜,如果带私家花园也算值了)好,看看

交付后:
我:出门到自家花园溜溜。地儿挺大,但看起来光秃秃的,先种颗树~
隔壁老王:(杀猪叫)谁在我家花园栽树了!!
我:(??)这TM是公共花园??
销售小吴:这多好啊,一家种树,一起乘凉~

  1. function House() {}
  2. let myHouse = new House()
  3. let wangHouse = new House()
  4. //myHouse.__proto.__ 等价于 House.prototype
  5. myHouse.__proto.__.tree = true
  6. console.log(myHouse.tree)
  7. console.log(wangHouse.tree)

重新认识函数
  • 所有函数都有一个.prototype属性,对应的是一个空对象(暂且认为)
  • 当用new 函数 创建对象时,对象都拥有.proto属性,都指向该函数 的.prototype
  • 当使用对象的属性时,先从自有属性找,找不到再从.proto里找

image.png

以下三者等价

  • Dog.prototype.age
  • dog1.proto.age
  • dog1.age

Object 与Function

  • Object 和 Function 都是函数
  • 普通的对象是Object函数创建的
  • 任何函数都是由Function函数创建的
  • Function创建了Function

原型链

对于如下代码,dog.toString是哪里来的?

  1. function Dog() {
  2. this.color = color
  3. }
  4. let dog = new Dog('yellow')
  5. console.log( dog.toString() )

image.png

  • new Dog创建dog1对象,Dog.prototype === dog1.proto
  • dog1.proto是个普通对象,是由new Object 创建的, Object.prototype === dog1.proto.proto
  • dog1.toString === dog1.proto.proto.toString

为什么要有Prototype

  • 重复资源共享
  • 链式访问能方便实现继承