border-image 图片 实现
1 | .border-image-1px { |
缺点 要有图片,圆角会模糊
background-image 渐变实现
1 | .border { |
缺点, 圆角会模糊 优点,不用图片
划船不用浆,一生全靠浪
1 | .border-image-1px { |
缺点 要有图片,圆角会模糊
1 | .border { |
缺点, 圆角会模糊 优点,不用图片
浅拷贝只复制一层对象的属性,并不包括对象里面的为引用类型的数据
1 | var obj1 = { |
1 | function Person() { |
优点:
- 通过constructor或者instanceof可以识别对象实例的类别
- 可以通过new 关键字来创建对象实例,更像OO语言中创建对象实例
缺点:
- 多个实例的say方法都是实现一样的效果,但是却存储了很多次(两个对象实例的say方法是不同的,因为存放的地址不同)
注意:
- 构造函数模式隐试的在最后返回return this 所以在缺少new的情况下,会将属性和方法添加给全局对象,浏览器端就会添加给window对象。
- 也可以根据return this 的特性调用call或者apply指定this。这一点在后面的继承有很大帮助。
1 | function Person(){} |
优点:
- say方法是共享的了,所有的实例的say方法都指向同一个。
- 可以动态的添加原型对象的方法和属性,并直接反映在对象实例上。
1
2
3
4
5 var person1 = new Person()
Person.prototype.showFriends = function() {
console.log(this.friends)
}
person1.showFriends() //['lilei']
缺点:
- 出现引用的情况下会出现问题具体见下面代码:
1
2
3
4 var person1 = new Person();
var person2 = new Person();
person1.friends.push('xiaoming');
console.log(person2.friends) //['lilei', 'xiaoming']
因为js对引用类型的赋值都是将地址存储在变量中,所以person1和person2的friends属性指向的是同一块存储区域。
- 第一次调用say方法或者name属性的时候会搜索两次,第一次是在实例上寻找say方法,没有找到就去原型对象(Person.prototype)上找say方法,找到后就会在实力上添加这些方法or属性。
- 所有的方法都是共享的,没有办法创建实例自己的属性和方法,也没有办法像构造函数那样传递参数。
注意:
- 优点②中存在一个问题就是直接通过对象字面量给Person.prototype进行赋值的时候会导致constructor改变,所以需要手动设置,其次就是通过对象字面量给Person.prototype进行赋值,会无法作用在之前创建的对象实例上
1
2
3
4
5
6
7
8 var person1 = new Person()
Person.prototype = {
name: 'hanmeimei2',
setName: function(name){
this.name = name
}
}
person1.setName() //Uncaught TypeError: person1.set is not a function(…)
这是因为对象实例和对象原型直接是通过一个指针链接的,这个指针是一个内部属性[[Prototype]],可以通过proto访问。我们通过对象字面量修改了Person.prototype指向的地址,然而对象实例的proto,并没有跟着一起更新,所以这就导致,实例还访问着原来的Person.prototype,所以建议不要通过这种方式去改变Person.prototype属性
1 | function Person(name) { |
优点:
- 解决了原型模式对于引用对象的缺点
- 解决了原型模式没有办法传递参数的缺点
- 解决了构造函数模式不能共享方法的缺点
1 | class Animal { |
当我们使用箭头函数时,函数体内的this对象,就是定义时所在的对象,而不是使用时所在的对象。并不是因为箭头函数部有绑定this的机制,实际原因是箭头函数根本没有自己的this,它的this是继承外面的,因此内部的this就是外层代码块的this。
BFC,块级格式化上下文,一个创建了新的BFC的盒子是独立布局的,盒子里面的子元素的样式不会影响到外面的元素。在同一个BFC中的两个毗邻的块级盒在垂直方向(和布局方向有关系)的margin会发生折叠。
- 理解对象的原型(可以通过Object.getPrototypeOf(obj)或者已被弃用的proto属性获得)
每个实例上都有的属性
- 与构造函数的prototype属性之间的区别是很重要的。
构造函数的属性
- 也就是说,Object.getPrototypeOf(new Foobar())和Foobar.prototype指向着同一个对象。
#JS执行机制1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19setTimeout(function(){
console.log('定时器开始啦') //主线程没任务就执行 d
});
new Promise(function(resolve){
console.log('马上执行for循环啦');//new Promise立即执行 和宏任务属于同一队列 a
for(var i = 0; i < 10000; i++){
i == 9999 && resolve(i);
}
}).then(function(i){
console.log('执行then函数啦',i)//resolve()执行才会打印 c
});
console.log('代码执行结束');// b
// 马上执行for循环啦
// 代码执行结束
// 执行then函数啦
// 定时器开始啦
1 | for (var i = 0; i < 5; i++) { |