js 深度学习 -Class的幻象
js 深度学习 -Class 的幻象
You-Dont-Know-JS(你不知道的 js 这本书的开源版本)
You-Dont-Know-JS(你不知道的 js 这本书的开源版本)
github 国内翻译
https://github.com/JoeHetfield/You-Dont-Know-JS
掘金中文
https://juejin.cn/post/6844903478813261831
github 原帖
Class
子类得到一份它需要从父类继承的东西的拷贝。类继承意味着拷贝。
类是一种设计模式。许多语言提供语法来启用自然而然的面向类的软件设计。JS 也有相似的语法,但是它的行为和你在其他语言中熟悉的工作原理 有很大的不同。
类意味着拷贝。
当一个传统的类被实例化时,就发生了类的行为向实例中拷贝。当类被继承时,也发生父类的行为向子类的拷贝。
多态(在继承链的不同层级上拥有同名的内容不同函数)也许看起来意味着一个从子类回到父类的相对引用链接,但是它仍然只是拷贝行的的结果。
JavaScript 不会自动地 (像类那样)在对象间创建拷贝。
mixin 模式常用于在 某种程度上 模拟类的拷贝行为。
混入其实就是用拷贝的方式模拟类的拷贝行为
但是这通常导致像显式假想多态那样(OtherObj.methodName.call(this, …))难看而且脆弱的语法,这样的语法又常导致更难懂和更难维护的代码。
明确的 mixin 和类 拷贝 又不完全相同,因为对象(和函数!)仅仅是共享的引用被复制,不是对象/函数自身被复制。不注意这样的微小之处通常是各种陷阱的根源。
现代的 es6 Class
- 不再有指向.prototype的引用来弄乱代码。直接操作 prototype 是不优雅的
- 不需要用Object.create(..)来替换.prototype链接的对象,或者用proto和Object.setPrototypeOf(..)来设置它。extends 完美解决了这些问题
- super(..)现在给了我们非常有用的 相对多态 的能力,所以在链条上某一个层级上的任何方法,可以引用链条上相对上一层的同名方法。第四章中有一个关于构造器的奇怪现象:构造器不属于它们的类,而且因此与类没有联系。super()会在构造器内部想如你期望的那样工作。
- class字面语法对指定属性没有什么启发(仅对方法有)。这看起来限制了某些东西,但是绝大多数情况下期望一个属性(状态)存在于链条末端的“实例”以外的地方,这通常是一个错误和令人诧异(因为这个状态被隐含地在所有“实例”中“分享”)的。所以,也可以说class语法防止你出现错误。
- extends甚至允许你用非常自然的方式扩展内建的对象(子)类型,比如Array或者RegExp这原生的对象都是没有问题的。放 es6 之前 这会非常老火
本博客所有文章除特别声明外,均采用 CC BY-SA 4.0 协议 ,转载请注明出处!