设计模式
采用模式时必须要考虑到这么做是否有意义,绝对不能为了使用模式而使用模式。
策略模式
策略模式定义了算法族,分别封装起来,让它们之间可以互相替换,此模式让算法的变化独立于使用算法的客户。
场景:模拟鸭子游戏。游戏中会出现各种鸭子,一边游泳戏水,一边呱呱叫。
封装变化的代码
找出应用中可能需要变化之处,把它们独立出来,不要和那些不需要变化的代码混在一起。
把会变化的部分取出并封装起来,以便以后可以轻易地改动或扩充此部分,而不影响不需要变化的其他部分。
针对接口编程
针对接口编程,而不是针对实现编程。
”针对接口编程“ 真正的意思是 ”针对超类型(supertype)编程“。
多用组合,少用继承
使用组合建立系统具有很大的弹性,不仅可将算法族封装成类,更可以 “在运行时动态地改变行为”,只要组合的行为对象符合正确的接口标准即可。
CSS 实现水平垂直居中
1.flex布局,无需考虑父子宽高
1 | /* 父元素设置 */ |
2.相对定位+transform,无需考虑父子宽高
1 | /* 子元素设置 */ |
3.display:table-cell
1 | .parent { |
属性访问错误
查询不存在对象的属性会报错,如果 . 的左边是 null 或 undefined,则属性访问表达式会失败。因此在写类似 ``book.author.sername` 这样的表达式时,要确保 book 和 book.author 是有定义的。以下是两种防止这类问题的写法:
1 | surname = book && book.author && book.author.surname |
1 | let surname = book?.author?.surname |