任何函数都有prototype
function fn() {}console.dir(fn.prototype)

一般情况下,函数正常调用时的我们用不到这个属性(用不到不代表不存在)
某些情况下,这个却能用到
new一个函数创建对象
买房小故事
买房时:
销售小吴:我们先看一下房子的户型图,我们这里所有的房子都是带花园的。看这是房子,出门就是一个花园。要不现在就带您去花园看看?
我:(心里暗喜,价格虽然不便宜,如果带私家花园也算值了)好,看看
交付后:
我:出门到自家花园溜溜。地儿挺大,但看起来光秃秃的,先种颗树~
隔壁老王:(杀猪叫)谁在我家花园栽树了!!
我:(??)这TM是公共花园??
销售小吴:这多好啊,一家种树,一起乘凉~
function House() {}let myHouse = new House()let wangHouse = new House()//myHouse.__proto.__ 等价于 House.prototypemyHouse.__proto.__.tree = trueconsole.log(myHouse.tree)console.log(wangHouse.tree)
重新认识函数
- 所有函数都有一个.prototype属性,对应的是一个空对象(暂且认为)
- 当用
new 函数创建对象时,对象都拥有.proto属性,都指向该函数 的.prototype - 当使用对象的属性时,先从自有属性找,找不到再从.proto里找

以下三者等价
- Dog.prototype.age
- dog1.proto.age
- dog1.age
Object 与Function
- Object 和 Function 都是函数
- 普通的对象是Object函数创建的
- 任何函数都是由Function函数创建的
- Function创建了Function
原型链
对于如下代码,dog.toString是哪里来的?
function Dog() {this.color = color}let dog = new Dog('yellow')console.log( dog.toString() )

- new Dog创建dog1对象,Dog.prototype === dog1.proto
- dog1.proto是个普通对象,是由new Object 创建的, Object.prototype === dog1.proto.proto
- dog1.toString === dog1.proto.proto.toString
为什么要有Prototype
- 重复资源共享
- 链式访问能方便实现继承
