《你不知道的javascript》读书笔记之对象原型

66 阅读2分钟

我是一口气读完这个章节的,酣畅淋漓。关于作者对于类和原型机制的解释解答了我一直以来的困惑,实不相瞒我之前虽然也查询了相关资料,但是对于这块还是懵懵懂懂的,肯定不能算上是大彻大悟算是摸到了原型的门道,作者为我揭开了挡在面前的面纱,剩下的还是需要自己再去探索。 先上看书时做的思维导图:

6B7E9F0F-AABE-412E-A377-872D69FCF0C7.jpeg

  • 书中提到一个我从未设想过的神操作,结合for...of和自定义迭代器可以在自定义的数据结构上实现各种遍历(Symbol.iterator可以获取对象的@@iterator内部属性)

E4498E65-0EA3-47CF-9B2A-3F6B8E3B5E24.png

  • 作者认为强行使用javascript模拟静态语言的类设计模式是一种蹩脚的行为,javascript并不存在类,通过func.prototype“伪造”类会使代码更加臃肿和难以理解,应该拥抱javascript[[prototype]]的委托机制。

静态语言中实例化(或者继承)一个类意味着“把类的行为复制到对象中”,对于每一个实例都会重复这个过程。在javascript中并不会把一个对象复制到另一个对象,而是通过[[prototype]]把一个对象(A)关联到另一个对象(B),这样这个对象(A)就可以访问另一个对象(B)的属性和方法,[[prototype]]在对象A和B之间架起一座桥梁进行委托,并不是像静态语言父类和子类的垂直关系,而是通过任意方向(单向)的委托关联并排组织的兄弟关系,所以也可以反向委托,对象B也可以关联对象A,不过不能相互委托,防止引用了对象A和对象B都不在的属性时造成死循环。

class是javascript实现类设计模式的语法糖,由于javscript是不存在“类”的,万物都是对象,”伪造“的类实际是可以修改的对象,如果修改或者替换了”父类“的一个方法,那么”子类“和实例都会被影响,造成意料之外的结果

以下是书中的一个比较传统类设计模式和行为委托设计模式的案例:

8CEC566B-8CE9-43AE-B4AD-6444989BD416.png

DD696FF3-4B37-47CD-A898-424A06894609.png

相较之下很明显的是行为委托设计模式更着重于对象与对象的关系,不用去管prototype、构造函数之间复杂的关系,代码也更加简单