站点工具

用户工具


任何函数都有prototype

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

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

new一个函数创建对象

买房小故事

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

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

function House() {}
let myHouse = new House()
let wangHouse = new House()
 
//myHouse.__proto.__ 等价于 House.prototype
myHouse.__proto.__.tree = true  
console.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

  • 重复资源共享
  • 链式访问能方便实现继承
admin · 2021/09/16 11:07 · javascript_原型.txt