知识卡片

函数化继承

普通读书笔记卡 · 1493.c

内容

函数化继承用生成对象的函数把私有变量声明在闭包里,只把拥有特权方法的对象 that 返回出去,获得真正私有状态(伪类和原型继承都无法隐藏属性);通过 my 对象在继承链构造器间共享秘密成员,通过 superior 方法访问父类方法。代价是构造过程更繁琐,且每实例方法是独立闭包、无法跨实例共享。关联:[[闭包保存状态]];发散:安全敏感对象值得用更窄可见性换可靠性。

参考来源

- 位置:《JavaScript语言精粹(修订版)》第5章《继承 Inheritance》"函数化"一节 - 结论依据:原文指出伪类和原型继承都"没法保护隐私……对象的所有属性都是可见的",给出函数化模式的四个步骤(创建对象、声明私有变量、扩充特权方法、返回对象),并用 mammal/cat 例子展示 name、saying 变为完全私有、只能通过特权方法访问,据此推出函数化继承用闭包换取真正封装的结论。 - 原始内容:迄今为止,我们所看到的继承模式的一个弱点就是没法保护隐私。对象的所有属性都是可见的……name和saying属性现在是完全私有的。只有通过get_name和says两个特权方法才可以访问它们。