【学习笔记】深入理解js原型和闭包系列学习笔记
谁管谁
深入理解js原型和闭包笔记:
1.“一切皆是对象”,对象是属性的集合。
函数也是对象,但是使用typeof时为什么函数返回function而
不是object呢,js为何要对函数做这样的区分?函数和对象到底什么关系呢?
2.函数和对象的关系(函数是对象创建的,但同时函数又是一种对象)
对象是通过函数创建的,那它的属性是如何通过函数构造的,
又为什么说函数自身也是一种对象呢,函数有什么对象的特质(对象的特质是属性的集合),难道函数也是属性的集合?它有什么属性呢?
3.函数的属性:prototype原型(函数也是对象,都有一个叫做prototype原型的属性,这个属性的属性值也是一个对象,该对象中又默认包含一个constructor的属性,指向函数本身。函数所创建的对象所具有的属性定义来源于‘Fn.prototype.对象属性’)
但是我们使用对象的属性时都是 ‘对象.属性名’这种方式,为什么不是 ‘对象.prototype.属性名’呢,明明属性名是定义在prototype下的,原来对象都有一个隐藏原型 _proto_,‘对象._proto_’=== Fn.prototype .
4.隐藏原型(每一个对象都有一个隐藏原型,指向创建该对象的函数的prototype —别忘了每一个函数都有一个prototype属性哦)
那么问题来了,上面说函数的prototype属性值也是对象,那它的_proto_指向哪,prototype属性值对象是被Object函数创建的,它的_proto_指向Object函数的prototype,那Object函数的prototype属性值的_proto_指向哪呢,Object函数的prototype属性值的_proto_指向null。还有一个问题,上面函数也是对象,那函数的_proto_指向哪呢,函数是由Function函数创建来的,所以函数的_proto_指向Function函数的prototype。那Function函数的_proto_指向哪呢,答案是指向Function自身的prototype,因为Function被自身所创建,这也形成了一个环形引用。(只需要记住一个准则,对象的_proto_指向创建它的函数的prototype)
是不是很乱,吼吼,一点也不乱。要是你和我一样都喜欢整洁干净感觉还乱,那么接下来我们借助instanceof来帮助我们理清一下js内部“混乱的关系”。(此处应有图展示了普通函数、Funciton及Object的关系)
5.instanceof(A instanceof B的判断规则是:沿着A的_proto_这条线来找,同时沿着B的prototype的这条线来找,如果这两条线能找到同一个引用,即同一个对象,那么就返回true,如果找到终点还未重合,则返回false。Instanceof表示的是一种继承关系,或者原型链的结构。这时再对着图理一理是不是更加清楚了,原来他们指来指去就是在构造这样的继承关系)。
Instanceof这样设计,是想表达什么,是想表达我们接下来介绍的东东——继承——原型链
6.原型链和继承(访问一个对象的属性时,先在基本属性中找,如果没有,在沿着_proto_这条链向上找,这就是原型链,而这种获取上级属性的方式就是继承)。
上面说了这么多函数、对象、原型、隐藏原型,以及之间如何相互指向构成js的继承和原型链的,那么我们也说一下这种原型的优势——灵活性
7.原型的灵活性(对象属性可以随时改动随时添加)如果你要添加内置方法的原型属性,最好做一步判断,如果该属性不存在则添加。如果本来就不存在,就没必要添加了。
——————————————————————————————————-
呵呵呵呵,终于看到分割线了,没错上面结束了。1~7介绍的就是js中的原型,从函数与对象的关系说起,介绍了js是如何通过函数和对象的原型、隐藏原型建立js内部的原型链和继承机制的。