时间:2021-07-01 10:21:17 帮助过:30人阅读
这两周参加公司的新项目,采用封闭式开发 (项目成员在会议室里开发),晚上加班到很晚,所以没时间和精力写原创博客了,今天就分享下这篇《编写高质量代码--Web前端开发修炼之道》读书笔记吧。
正文
欲精一行,必先通十行。
在前端开发这个领域,一专多能更是非常必要的。
table布局缺点:
css布局:div+css,或者(x)html+css。
代码量少、结构精简、语义清新。
代码量少,浏览器端下载时间就会更短;
语义清晰就会对搜索引擎更友好。
先确定html,确定语义的标签,再来选用合适的CSS。
浏览器会根据标签的语义给定一个默认定样式。
判断网页标签语义是否良好的一个简单方法就是:去掉样式,看网页结构是否组织良好有序,是否仍然有很好的可读性。
测试下DevTool中有没有禁用网页中的CSS设置?测试下w3c官网去掉样式后的效果。
当页面内标签无法满足设计需要时,才会适当添加div和span等无语义标签来辅助实现。
table布局适合展示二维数据。
语义化标签应注意的一些其他问题:
对于文件过于分散和集中的问题并没有完美的解决方案,我们需要根据实际情况做些适当的折中。
css rest:
补充:
reset浏览器默认样式,推荐: https://github.com/necolas/normalize.css
拆分模块:
驼峰法用于区别单词,划线用于表明从属关系。例如:.timeList-lastItem。
学习这种风格的命名:
.fr { float: right; }
.w25 { width: 25%; }
多用组合,少用继承。
当样式设置有冲突时,会采用权重高的样式。
html标签的权重:1,class的权重:10,ID的权重:100.
当权重相同时,会采用最近定义原则。
为了保证样式容易被覆盖,提高可为维护性,css选择符的权重尽可能低。
css的hack方式通常是 选择符前缀法 和 样式属性前缀法。
标签的四种状态定义顺序,l( link )ov( visited )e h( hover )a( acitive )te,即love hate原则。
块级元素和行内元素:
hasLayout:
是IE浏览器为解析盒模型而设计的一个专有属性,它的设计初衷是用于块级元素的,如果触发行内元素的hasLayout,就会让行内元素拥有一些块级元素的特性。
display:inline-block
行内的块级元素,它有块级元素的特点:可设置宽高、margin和padding值,也有行内元素的特点:不独占一行。
会触发hasLayout。垂直方向的对齐,可设置形如 *vertical-align: -10px 来解决。
为了实现E6、IE7和其他浏览器都兼容display: inline-block,也存在一定问题:
虽然IE6和IE7不支持CSS设置为display: inline-block,但事实上IE6和IE7的CSS解析引擎还是有display: inline-block的,比如说img标签和button标签都具有display: inline-block的特性,可以设置宽高但却不独占一行。
float
会改变正常的文档流排列,影响到周围元素。
position: absolute 和 float: left或float: right 会隐式地改变display类型,不论之前是什么类型的元素(display: none除外),都会让元素以display: inline-block方式显示:可以设置宽高,默认宽带并不占满父元素。
居中
网格布局
无论sidebar和main在样式上谁左谁右,在html标签上要保证main的标签在sidebar之前被加载。
只在最外层的容器给定具体宽度,所有其他容器的宽度均用百分比设置 ?? 网格布局。
z-index
z 轴在元素设置position为absolute或relative后被激活。
设置负边距可以让相邻元素的位置产生重叠,谁浮在上面,取决于html标签出现的先后,后出现的标签浮于先出现的标签之上。
IE6下的select遮挡问题,可使用同样大小的iframe遮住select。
为避免组件的上下外边距重合问题和IE的hasLaout引发的Bug,各模块除特殊需求,一律采用margin-top设置上下外边距。
Javascript
标签之前再调用init函数,此时页面内的DOM节点不一定都“加载完成”了,但一定都“生成”了,从而模拟DOMReady的效果。
高品质的组件特点:
面向过程存在三方面问题:
面向对象:
内聚:
指对象或类对外提供的接口非常简单易懂,复杂的底层操作都封装在对象或类的接口内部,对用户透明。
用户不用关心过多的底层细节,只需知道类提供了哪些接口,用户知道的底层细节越少,对象的聚合程度就越高。
耦合:
指的是类与类之间关联和依赖的程度,低耦合就是指类与类之间依赖的程度低,类与类通信需要关联的接口越少,耦合程度越低。
从大局上决定程序品质的,不是OOP,而是OOA和OOD。
OOA和OOD与具体语言无关,而OOP则直接跟语言相关。
Javascript是基于原型的语言,通过new 实例化出来的对象,其属性和行为来自于两部分,一部分来自于构造函数,另一部分来自于原型。
this关键字无论出现在构造函数中,还是出现在原型中,指向的都是实例对象,通过this关键字,可以让属性和方法在构造函数和原型间通信。
在javascript中公有还是私有是通过作用域实现的。
用this.XXX定义的属性是公有的,而用 var XXX定义的属性是私有的。
私有属性的作用域只在类的构造函数中。
将所有属性和行为,无论公有还是私有全部写在构造函数里,不推荐这么做。因为在内存中一个类的原型只有一个,写在原型中的行为,可以被所有实例所共享,实例化的时候,并不会在实例的内存中再复制一份,而写在类里的行为,实例化的时候会在每个实例里复制一份。
把行为写在原型里可以减少内存消耗,没有特殊原因,推荐尽量把行为写在原型里。
写在原型中的行为一定是公有的,而且无法访问私有属性。
在原型中定义私有行为,但通过给属性和行为的名称前面加上“_”来约定它是私有的,这是一种命名约定,它并不能真正实现行为的私有,但它能够让工程师知道它是设计成私有的,从而注意避开像公有行为那样调用它。
如果使用set方法来设置属性,那么我们就有了监听属性valueChange的入口。
Javascript中继承是要分别继承构造函数和原型中的属性和行为的。
Javascript中function的两种用法:
可以通过function对象上的call或者apply函数来修改函数的上下文this。
传值和传址:
prototype本质上也是个hash对象,所以直接用它赋值时会进行传址。
Bird.prototype = new Animal(); // Bird.prototype.constructor指向了Animal
Bird.prototype.constructor = Bird; // Bird.prototype.constructor重新指向了Bird
只要是类就会有原型,不管它是自定义类还是javascript的内置类。
内置类的方法可以重写,但属性却不能重写。
代替直接修改内置类原型的做法,定义一个自定义类,将内置类的实例作为参数传给构造函数,在自定义类里定义扩展方法。这种做法的思路是将内置类再封装一层,以此保护内置类的原型不被污染。
定义在html标签中的属性,在javascript中有两种获取方式:
从兼容性考虑,建议对于常规属性,统一使用 node.XXX的方式读取,对于自定义属性,统一使用 node.getAttribute(“XXX”)读取。
将复杂类型的数据转化成字符串,称为数据的序列化,其逆操作叫做数据的反序列化。
字符串的反序列化是通过eval函数实现的。
event对象在IE和Firefox下的表现是不同的。
在IE下,event是window对象的一个属性,是在全局作用域下的,
而在Firefox里,event对象作为事件的参数存在。
在祖先节点上监听事件(利用冒泡机制),可有效减小内存开销。比如,jquery的 delegate()方法。