谁管谁

深入理解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函数的prototypeFunction函数的_proto_指向哪呢,答案是指向Function自身的prototype,因为Function被自身所创建,这也形成了一个环形引用。(只需要记住一个准则,对象的_proto_指向创建它的函数的prototype

                                  是不是很乱,吼吼,一点也不乱。要是你和我一样都喜欢整洁干净感觉还乱,那么接下来我们借助instanceof来帮助我们理清一下js内部“混乱的关系”。(此处应有图展示了普通函数、FuncitonObject的关系)

5.instanceofA instanceof B的判断规则是:沿着A_proto_这条线来找,同时沿着Bprototype的这条线来找,如果这两条线能找到同一个引用,即同一个对象,那么就返回true,如果找到终点还未重合,则返回falseInstanceof表示的是一种继承关系,或者原型链的结构。这时再对着图理一理是不是更加清楚了,原来他们指来指去就是在构造这样的继承关系)。

Instanceof这样设计,是想表达什么,是想表达我们接下来介绍的东东——继承——原型链

 

 

6.原型链和继承(访问一个对象的属性时,先在基本属性中找,如果没有,在沿着_proto_这条链向上找,这就是原型链,而这种获取上级属性的方式就是继承)。

上面说了这么多函数、对象、原型、隐藏原型,以及之间如何相互指向构成js的继承和原型链的,那么我们也说一下这种原型的优势——灵活性

7.原型的灵活性(对象属性可以随时改动随时添加)如果你要添加内置方法的原型属性,最好做一步判断,如果该属性不存在则添加。如果本来就不存在,就没必要添加了。

——————————————————————————————————-

呵呵呵呵,终于看到分割线了,没错上面结束了。1~7介绍的就是js中的原型,从函数与对象的关系说起,介绍了js是如何通过函数和对象的原型、隐藏原型建立js内部的原型链和继承机制的。

 

版权声明:本文为lauzhishuai原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://www.cnblogs.com/lauzhishuai/p/10084043.html