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 原帖

https://github.com/getify/You-Dont-Know-JS

Class

子类得到一份它需要从父类继承的东西的拷贝。类继承意味着拷贝。

类是一种设计模式。许多语言提供语法来启用自然而然的面向类的软件设计。JS 也有相似的语法,但是它的行为和你在其他语言中熟悉的工作原理 有很大的不同

类意味着拷贝。

当一个传统的类被实例化时,就发生了类的行为向实例中拷贝。当类被继承时,也发生父类的行为向子类的拷贝。

多态(在继承链的不同层级上拥有同名的内容不同函数)也许看起来意味着一个从子类回到父类的相对引用链接,但是它仍然只是拷贝行的的结果。

JavaScript 不会自动地 (像类那样)在对象间创建拷贝。

mixin 模式常用于在 某种程度上 模拟类的拷贝行为。

混入其实就是用拷贝的方式模拟类的拷贝行为

但是这通常导致像显式假想多态那样(OtherObj.methodName.call(this, …))难看而且脆弱的语法,这样的语法又常导致更难懂和更难维护的代码。

明确的 mixin 和类 拷贝 又不完全相同,因为对象(和函数!)仅仅是共享的引用被复制,不是对象/函数自身被复制。不注意这样的微小之处通常是各种陷阱的根源。

现代的 es6 Class

  1. 不再有指向.prototype的引用来弄乱代码。直接操作 prototype 是不优雅的
  2. 不需要用Object.create(..)来替换.prototype链接的对象,或者用protoObject.setPrototypeOf(..)来设置它。extends 完美解决了这些问题
  3. super(..)现在给了我们非常有用的 相对多态 的能力,所以在链条上某一个层级上的任何方法,可以引用链条上相对上一层的同名方法。第四章中有一个关于构造器的奇怪现象:构造器不属于它们的类,而且因此与类没有联系。super()会在构造器内部想如你期望的那样工作。
  4. class字面语法对指定属性没有什么启发(仅对方法有)。这看起来限制了某些东西,但是绝大多数情况下期望一个属性(状态)存在于链条末端的“实例”以外的地方,这通常是一个错误和令人诧异(因为这个状态被隐含地在所有“实例”中“分享”)的。所以,也可以说class语法防止你出现错误。
  5. extends甚至允许你用非常自然的方式扩展内建的对象(子)类型,比如Array或者RegExp这原生的对象都是没有问题的。放 es6 之前 这会非常老火

本博客所有文章除特别声明外,均采用 CC BY-SA 4.0 协议 ,转载请注明出处!